Typy generyczne - generacja pakietu MSI

0

Witajcie,

jestem tu nowy wiec jesli cos zle zrobilem prosze na mnie nie krzyczec :-)

Otoz programuje w VS2013 z uzyciem jezyka C#. Uzywam typow genrycznych, konkretniej mowiac listy. Podczas debugowania program dziala bez zarzutow. Nastepnie generuje paczke MSI, by program mozna zainstalowac na innej maszynie. I tu zaczynaja sie schody. Po instalacji mojego oprogramowania na maszynie nie posiadajacej VS2013, funkcje w ktorych uzylem typu generycznego listy po prostu nie dzialaja.

Bardzo prosze Was o pomoc. Przetrzepalem cale google. Nic nie znalazlem. Mozliwe ze zle szukalem.
Pozdrawiam Was serdecznie,
Chris :-)

0

Co to znaczy "nie działają"? Nie uruchamiają się? Uruchamiają i rzucają wyjątkiem? Nie robią kawy?

0

Witaj,

Za pomoca Add dodaje kolejne rekordy w metodzie numer 1. W metodzie numer 2 odpytuje przykladowo Count. Jako wynik otrzymuje "0". Mimo, ze w metodzie wczesniejszej dodalem juz jeden element. Na tym polega defekt. Przepraszam, ze niezbyt jasno opisalem problem.

0

Pokaż zatem kod.

0
 

using Microsoft.Office.Core;
using Microsoft.Office.Interop.Outlook;
using SAP.Middleware.Connector;
using stdole;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using Office = Microsoft.Office.Core;
using Outlook = Microsoft.Office.Interop.Outlook;


namespace Outlook2013_SAPExport
{
    public partial class ThisAddIn
    {
        Class_SAP SAP = new Class_SAP();
        List<string> Sprachen = new List<string>();
        List<Bitmap> Land_Flag = new List<Bitmap>();
        List<CommandBarButton> Lang_Menu = new List<CommandBarButton>();
        private Office.CommandBar menuBar;
        private Office.CommandBar menuBar1;
        private Office.CommandBarPopup newMenuBar;
        private Office.CommandBarPopup newMenuBar1;
        private Office.CommandBarButton button1;                       
        private Office.CommandBarButton button2;
        private string menuTag = Sprache.SAP_Menu1;                     
        public int checker = -1;
        string langu_code = "";
        bool default_sprache = true;
        private STR_SAP_Sprache GUI;


        protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
        {
            return new Ribbon_Kontextmenu_Mail();
        }



        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            Bereit_die_Daten_vor(Prueft_verfuegbare_Dateien(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\"));
            Sprache_vor_dem_Start();
            RemoveMenubar();
            Bar_bilden();
            AddMenuBar();
            AddKontextMenu();

        }

        public Outlook.Selection GetOutlookMailItemSelected()
        {
            Outlook.Selection selection = this.Application.ActiveExplorer().Selection;

            return selection;
        }


        public void Bar_bilden()
        {
            for(int i = 0; i < Sprachen.Count(); i++)
            {
                CommandBarButton button = null;
                Lang_Menu.Add(button);
            }
        }

        private List<string> Prueft_verfuegbare_Dateien(string Pfad)
        {
            Directory.GetFiles(Pfad);
            List<string> liste = Directory.GetFiles(Pfad).ToList<string>();
            return liste;
        }
        private void Bereit_die_Daten_vor(List<string> liste)
        {
            char[] tmp;
            string check_code = "";
            try
            {
                for(int i = 0; i<liste.Count; i++)
                {
                    tmp = new char[100];
                    tmp = liste[i].ToArray();
                    check_code = "";
                    langu_code = "";
                    for (int j = 0; j < 10; j++)
                    {
                        check_code += tmp.ElementAt(j+35);
                    }
                    if (check_code == "SOI_LANGU_")
                    {
                        langu_code += tmp.ElementAt(45).ToString();
                        langu_code += tmp.ElementAt(46).ToString();
                        Sprachen.Add(langu_code);     
                    }
                } 
                
            }
            catch
            {
                MessageBox.Show("I can't find any SOI_LANGU_##.xml Data!");
            }
        }


        private void AddMenuBar()
        {
            for(int m = 0; m < Sprachen.Count; m++)
            {
                try
                {
                    string pfad = "";
                    pfad = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\";
                    pfad += "\\SOIBild\\";
                    pfad += Sprachen[m];
                    pfad += ".png";
                    Land_Flag.Add(new Bitmap(pfad));
                    pfad = "";
               }
               catch
               {
                    MessageBox.Show("No PNG - Data for Speech Packets in Ressource!");
               }
            }

            try
            {
                menuBar = this.Application.ActiveExplorer().CommandBars.ActiveMenuBar;
                newMenuBar = (Office.CommandBarPopup)menuBar.Controls.Add(Office.MsoControlType.msoControlPopup, missing, missing, missing, false);           
                if (newMenuBar != null)
                { 
                    newMenuBar.Caption = Sprache.SAP_Menu1;                     
                    newMenuBar.Tag = menuTag;

                    button1 = (Office.CommandBarButton)newMenuBar.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, 1, true);
                    button1.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
                    button1.Caption = SAP.GUI_Sprache.text003;            
                    button1.FaceId = 65;
                    button1.Tag = SAP.GUI_Sprache.text003;           
                    button1.Click += new Office._CommandBarButtonEvents_ClickEventHandler(Addin_Menu1_click);
                    button1.Picture = ImageConverter.ImageToPictureDisp(Bilder.settings_icon);

                    button2 = (Office.CommandBarButton)newMenuBar.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, 1, true);
                    button2.Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
                    button2.Caption = SAP.GUI_Sprache.text002;       
                    button2.FaceId = 65;
                    button2.Tag = SAP.GUI_Sprache.text002;             
                    button2.Click += new Office._CommandBarButtonEvents_ClickEventHandler(Addin_Menu1_click);
                    button2.Picture = ImageConverter.ImageToPictureDisp(Bilder.info);

                    newMenuBar.Visible = true;

                    menuBar1 = this.Application.ActiveExplorer().CommandBars.ActiveMenuBar;
                    newMenuBar1 = (Office.CommandBarPopup)newMenuBar.Controls.Add(Office.MsoControlType.msoControlPopup, missing, missing, missing, false);
                    if (newMenuBar1 != null)
                    {
                        newMenuBar1.Caption = SAP.GUI_Sprache.text000;                  
                        newMenuBar1.Tag = menuTag;

                        for (int i = 0; i < Lang_Menu.Count(); i++)
                        {
                            Lang_Menu[i] = (Office.CommandBarButton)newMenuBar1.Controls.Add(Office.MsoControlType.msoControlButton, missing, missing, 1, true);
                            Lang_Menu[i].Style = Office.MsoButtonStyle.msoButtonIconAndCaption;
                            Lang_Menu[i].Caption = Sprachen[i];
                            Lang_Menu[i].FaceId = 65;
                            Lang_Menu[i].Tag = Sprachen[i];
                            Lang_Menu[i].Click += new Office._CommandBarButtonEvents_ClickEventHandler(Addin_Menu1_click);
                            Lang_Menu[i].Picture = ImageConverter.ImageToPictureDisp(Land_Flag[i]);

                        }
                        newMenuBar1.Visible = true;
                    }
                }         
            
            }
            catch
            {
                // MessageBox.Show("Ein Fehler ist aufgetreten. (AddMenuBar)");
            }
        }

0

I która lista jest wypełniana w której metodzie, a w której jest rzekomo pusta?

Ty chyba bardzo nie chcesz, aby Ci pomóc, skoro zamiast opisać problem od razu, wszystko trzeba z Ciebie wyciągać.

0

Przepraszam za moje roztrzepanie.

Dla przykladu mozna wziasci metode :

       private void Bereit_die_Daten_vor(List<string> liste)
        {
            char[] tmp;
            string check_code = "";
            try
            {
                for(int i = 0; i<liste.Count; i++)
                {
                    tmp = new char[100];
                    tmp = liste[i].ToArray();
                    check_code = "";
                    langu_code = "";
                    for (int j = 0; j < 10; j++)
                    {
                        check_code += tmp.ElementAt(j+35);
                    }
                    if (check_code == "SOI_LANGU_")
                    {
                        langu_code += tmp.ElementAt(45).ToString();
                        langu_code += tmp.ElementAt(46).ToString();
                        Sprachen.Add(langu_code);     
                    }
                } 
 
            }
            catch
            {
                MessageBox.Show("I can't find any SOI_LANGU_##.xml Data!");
            }
        } 

gdzie za pomoca polecenia Sprachen.Add(langu_code); umieszczam kolejne elementy w liscie.

Nastepnie bierzemy pod uwage kolejna metode:

    public void Bar_bilden()
        {
            for(int i = 0; i < Sprachen.Count(); i++)
            {
                CommandBarButton button = null;
                Lang_Menu.Add(button);
            }
        }

Tutaj lista "sprachen" powinna zawierac elementy wczesniej dodane w metodzie Bereit_die_Daten_vor. Jednak jej zawartosc jest rowna zero. Oczywiscie tylko wtedy, gdy Addon uruchamiany jest na maszynie na ktorej nie zainstalowano Visual Studio. Podczas debugowania nie zglasza problemu i dziala bez problemu. Przypuszczam, ze ta sytuacje sprawuje brak jakiejs biblioteki (np. ta ktora obsluguje System.Collections).

P.S.: Deklaracja listy naturalnie w partial class:

 List<string> Sprachen = new List<string>(); 

Dziekuje za pomoc i pozdrawiam.

0

Bereit_die_Daten_vor jest wywolywane wylacznie z ThisAddIn_Startup, ktore z kolei nie jest wolane nigdzie, wiec sila rzeczy nie ma prawa nic byc w kolekcji... mala uwaga - uzywaj Count zamiast Count() skoro operujesz na liscie, a najlepiej to rob foreach skoro iterujesz po wszystkim, reszte dziadostwa w tym kodzie pomijam (lacznie z krejzolowatym nazewnictwem ;))

0

Podczas startu Outlooka dane sa pobierane jednorazowo. Tam tez zostaje wypelniona lista Sprachen, ktora w kolejnych metodach bedzie uzywana jako kontener z danymi.

P.S. Nazewnictwo jest takie, poniewaz nie mieszkam w Polsce, a jezyk polski nie jest uzywany tu jako administracyjny. Dlatego tez tlumaczenia sa takie, by inni pracujacy przy projekcie rozumieli o co chodzi.

0

dodaj sobie logowanie do metody ThisAddIn_Startup i sprawdz czy jest faktycznie wywolywana

0

Jako maly tester uzywalem MessageBox.Show(tutaj odpytywalem ilosc elementow na liscie). Na jednostce stacjonarnej, gdzie egzystuje VS2013 wszystko jest ok. Ilosc elementow jest rowna np. 4. Na jednostce bez VS2013 wynika daje 0.

0

dodaj sobie logowanie do metody ThisAddIn_Startup i sprawdz czy jest faktycznie wywolywana

0

Tym poleceniem sprawdzilem:

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg");

Jest wywolywana.

0

Jakieś nietypowe informacje w event viewerze?

0

Kompletnie nic. Wszystko wskazuje, ze jest ok. A mimo to po instalacji msi nie dziala jedna z funkcji, gdzie uzywam typow generycznych. :-(

0

A sprawdziłeś, że wersja bez typów generycznych działa?

0

Tak. Statycznie sobie wprowadzilem pojedyncza zmienna. Wtedy wszystko bylo ok.

1

Nawet najprostsza apka konsolowa gdzie używasz generyków nie działa? 0.O

0

Ja tylko testowalem na moim przykladzie. Na najprostszej appce nie. Chodzi, o to ze jest to Addon Office. Wygenerowany plik to VSTO. Na podstawie nie produkuje MSI. Obawiam sie, ze jakos nie przekazuje bibliotek DLL jako redistributable. :-(

0

@ UP: Problem sie rozwiazal. Temat mozna zamknac. Dziekuje wszystkim zaangazowanym i goraco pozdrawiam wszystkich Kolegow i Kolezanki!

1

Jak się rozwiązał to powiedz co było nie tak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1