mojaSymfonia FORUM
https://forum.mix-soft.pl/

Wywołanie funkcji napisanej w .NET dla modułu Handel
https://forum.mix-soft.pl/viewtopic.php?f=15&t=7939
Strona 1 z 1

Autor:  arnoldinho [ 2017-05-31, 11:18 ]
Tytuł:  Wywołanie funkcji napisanej w .NET dla modułu Handel

Witam użytkowników forum mojasymfonia.pl
piszę dodatek do Symfonii, który będzie przez web service przesyłał dane na serwer. Czy jest możliwość uruchomienia za pomocą raportu AMBasic funkcji ze skompilowanej dll podając jej nazwę i parametry? Mam na myśli coś podobnego do viewtopic.php?p=346#p346 ale chcę użyć C#. W części C# będę używał https://msdn.microsoft.com/en-us/library/debx8sh9(v=vs.110).aspx Mam zamiar wywołać funkcję pobierającą kilka stringów i zwracającą string oraz wyświetlić ten string jako komunikat, prawdopodobna sygnatura: string response= WyslijNaServer(string numerFaktury, string kwota, string NIPNabywcy, string terminPlatnosci)
Jak można to zrobić? Czy wystarczy wsadzić w odpowiednie miejsce plik .dll i wywołać funkcję po nazwie? Do tej pory programowałem w enovie i wyglądało to trochę inaczej.

Autor:  rafal [ 2017-05-31, 12:03 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

najprościej wywołaj program z parametrami.

Autor:  arnoldinho [ 2017-05-31, 12:22 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

Jest to tego jakieś polecenie w AMBasic? Przeszukałem chyba całą dokumentację i nie znalazłem. Znalazłem Run ale on uruchamia inne raporty i Execute który uruchamia plik .exe i nie ma możliwości wstawienia parametrów.
Jak się nazywa funkcja która odpali moją dll?
W jakim katalogu powinien znajdować się plik dll?

Autor:  rafal [ 2017-05-31, 12:50 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

arnoldinho pisze:
Jest to tego jakieś polecenie w AMBasic? Przeszukałem chyba całą dokumentację i nie znalazłem. Znalazłem Run ale on uruchamia inne raporty i Execute który uruchamia plik .exe i nie ma możliwości wstawienia parametrów.


możesz użyć viewtopic.php?p=24558#p24558

arnoldinho pisze:
Jak się nazywa funkcja która odpali moją dll?


Kod:
dispatch


arnoldinho pisze:
W jakim katalogu powinien znajdować się plik dll?


obojętnie bo jest i tak rejestrowany w systemie

Autor:  arnoldinho [ 2017-05-31, 14:40 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

dla kodu
Kod:
namespace InvoicesExporter
{
    [ComVisible(true)]
    public class Class1
    {
        Class1()
        {
        }
        public string Hello(string name)
        {
            return "Hello "+ name;
        }

        [ComRegisterFunction()]
        public static void RegisterClass(string key)
        {
            // Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
            StringBuilder sb = new StringBuilder(key);
            sb.Replace(@"HKEY_CLASSES_ROOT\", "");

            // Open the CLSID\{guid} key for write access
            RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);

            // And create the 'Control' key - this allows it to show up in
            // the ActiveX control container
            RegistryKey ctrl = k.CreateSubKey("Control");
            ctrl.Close();

            // Next create the CodeBase entry - needed if not string named and GACced.
            RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
            inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
            inprocServer32.Close();

            // Finally close the main key
            k.Close();
        }

        [ComUnregisterFunction()]
        public static void UnregisterClass(string key)
        {
            StringBuilder sb = new StringBuilder(key);
            sb.Replace(@"HKEY_CLASSES_ROOT\", "");

            // Open HKCR\CLSID\{guid} for write access
            RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);

            // Delete the 'Control' key, but don't throw an exception if it does not exist
            k.DeleteSubKey("Control", false);

            // Next open up InprocServer32
            RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);

            // And delete the CodeBase key, again not throwing if missing
            k.DeleteSubKey("CodeBase", false);

            // Finally close the main key
            k.Close();
        }
    }
}

pokazuje mi komunikat jak w załączniku,
dodałem również
- w zakładce Build zaznacz Register for COM interop
- w zakładce Application przycisk w Assembly Information zaznacz Make assembly COM-Visible
o czym pisałeś w innym temacie,
przeniosłem dll do katalogu z symfonią i dalej pokazuje się błąd
Gdzie może leżeć przyczyna?

Testowałem przykład z kalkulatorem i działa ale wolałbym nie tworzyć pliku exe

Załączniki:
blad1.png
blad1.png [ 57.6 KiB | Przeglądany 3809 razy ]

Autor:  rafal [ 2017-05-31, 14:51 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

Jak budujesz projekt to tworzona jest biblioteka dll rejestrowana w systemie. Jak ja przenosisz to jej nie znajdzie przy tworzeniu obiektu.

Autor:  arnoldinho [ 2017-05-31, 15:28 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

W folderze z symfonią wrzuciłem kopię zostawiając w też dll w folderze z projektem, więc to chyba nie o to chodzi. Doczytałem o tym rejestrowaniu w rejestrze i nie wiem czy na pewno ten program sam się tam rejestruje, czy sam mam go zarejestrować? Użyłem tego tutoriala https://kb.blackbaud.com/articles/Article/48280 i dostałem nastepujący błąd
"Moduł C:\...\InvoicesExporter\bin\Release\InvoicesExporter.dll został załadowany ale nie odnaleziono punktu wejścia DllRegisterServer.
Upewnij się, że plik C:\...\InvoicesExporter\bin\Release\InvoicesExporter.dll InvoicesExporter.dll jest prawidłowym plikiem DLL lub OCX, a następnie spróbuj ponownie".
Co może być nie tak z tą dll?

Autor:  rafal [ 2017-05-31, 16:26 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

Jeżeli Symfonia jest na tej samej maszynie co VisualStudio to podczas budowania projektu kontrolka jest rejestrowana.

Autor:  arnoldinho [ 2017-06-06, 12:24 ]
Tytuł:  Re: Wywołanie funkcji napisanej w .NET dla modułu Handel

Udało się, dziękuje za pomoc.
Rozwiązanie okazało się o wiele prostsze niż się spodziewałem.
Wystarczyło utworzyć klasę wg. tego tutoriala
https://docs.microsoft.com/en-us/dotnet ... -com-class

Strona 1 z 1 Strefa czasowa UTC+1godz. [letni]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/