C#, tworzenie biblioteki DLL zrozumiałej dla aplikacji natywnych

0

Hej! Może, dla nie których to się wyda oczywiste, ale czy da się prosto stworzyć w MS Visual C# 2010 bibliotekę DLL i użyć funkcji wyeksportowanych w bibliotece w środowisku niezarządzalnym a konkretnie CA Visual Objects 2.7...
O ile import bibliotek DLL typu "niezarządzanego" do C# jest możliwy bez problemów (PInvoke), to w drugą stronę chyba już nie jest tak prosto...
Znalazłem pewną stronę https://sites.google.com/site/robertgiesecke/Home/uploads/csharpprojecttemplateforunmanagedexportsloads/csharpprojecttemplateforunmanagedexports

Z góry dzięki za odpowiedzi i podzielenie się doświadczeniami z takim miksem :)

0

Nie wiem co to za wynalazek jest pod tym linkiem, więc na ostatnią część pytania nie odpowiem. Spróbuj sam.

Na pewno da się bez problemu zrobić to co chcesz w C++/CLI. Zazwyczaj robi się to na zasadzie pomostu, czyli właściwy kod pisany w C#, a w C++/CLI tylko „wrapper” – bibliotekę która eksportuje funkcje.

0

Ale biblioteka w C# do działania i tak pewnie będzie wymagała .NET Framework.

0

Oo może to jest jakieś rozwiązanie... Czyli bibliotekę stworzoną w C# importuje do biblioteki w C/C++ CLI i tę stworzoną w C/C++ CLI używam w CA Visual Objects?
Ciekawe czy CA Visual Objects rozpozna taką bibliotekę...

0

Prawdopodobnie najprościej będzie skorzystać z COM. Klasy w C# można wyeksportować za pomocą jednego checkboxa w ustawieniach projektu (w sporym uproszczeniu).

0

Ale tą klasę w DLL trzeba będzie zarejestrować w systemie ? Tak? :) Przepraszam, jeśli głupie pytania, ale po prostu jeszcze w tą stronę tego nie robiłem...
Cały dzień nie daje mi to spokoju... Bo aplikacja będzie dystrybuowana na kilkuset komputerach (w domenie Windowsowej) i jakoś to muszę wszystko dograć... Pogodzić aplikacje natywne z .netowymi, dostępy do baz danych..... itp...

0

To zrób aplikację webową zależną tylko od oprogramowania zainstalowanego na serwerze. Też możesz sobie w C# pisać. http://www.techrepublic.com/article/get-started-coding-c-in-aspnet/1045193

0

Ciekawe czy CA Visual Objects rozpozna taką bibliotekę...
„musi”.

0

Koledzy ci dobrze podpowiadają, zrób usługę w c# na serwerze aplikacji, i konsumuj ją WCF :)
my tak ćwiczymy - logika pisana w c#, widok w PHP i Delphi.

co więcej, były problemy z szyfrowaniem i kodowaniem, wiec w c# napisany jest moduł szyfrowania tak jak ty kombinujesz.
biblioteka wymaga .net na stacji klienckiej, ale jest pewna otoczka COM do tego i wymaga rejestracji.
Rejestracja odbywa się po instalacji z osobnym plikiem MSI, na samym koncu. reszta aplikacji idzie inno setupem.

http://forums.devshed.com/delphi-programming-90/c-dll-need-to-be-used-in-delphi-231122.html

0

O dzięki :) Jeszcze to skonsultuje w firmie...
Chodzi po prostu o to, że ogromny system bazodanowy jest napisany w CA Visual Objects, wieki temu... A zmienia się sposób logowania do programu bazodanowego. Są wykorzystywane do tego czytniki kart zbliżeniowych. Sterownik i interfejs do niego jest w C# i przykładowe okienko logowania. Chodzi o to, żeby zrobić bibliotekę DLL w C# która będzie pobierać informacje z karty zbliżeniowej (jest to pewien łańcuch znaków który zawiera informacje o użytkowniku) i przekazuje te info do aplikacji w CA Visual Objects no i tam już odbywa się reszta :) Ważna jest informacja z karty zbliżeniowej. Niestety w żaden sposób CA Visual Objects nie "współgra" ze sterownikiem do kart zbliżeniowych... Chyba, że jeszcze na coś wpadnę i jakoś uda się to ogarnąć... w inny sposób.

0

wodzu za wysoka szkoła jazdy dla mnie, nie ogarnę ci. Podpowiedziałem tyle ile wiedziałem, jak coś to pisz na pw, coś tam z doświadczeń podpowiem :)

2

W C++/CLI da się, bo sam to robiłem. Nie ma tu żadnej filozofii, normalne dllexport, a eksportowane funkcje/klasy wewnętrznie mogą sobie używać całego .net. Oczywiście potem .net i tak jest wymagany, ale dll-ki można używać z każdym kompilatorem (jeśli eksporty w stylu C oczywiście). Może to być wrapper w C++/CLI który używa assembly z C# dodanego jako referencja albo wszystko w C++/CLI.

No albo tylko w C# i zarejestrować jako COM, ale COM to syf generalnie i odradzałbym używanie tego, poza tym różne kompilatory (te natywne) róznie sobie radzą z obsługą tego. Kiedyś z C++ Builderem nieźle musiałem się naszarpać żeby wszystko działało.

[edit]
Co do tego linku - wygląda fajnie, ktoś dopisał sobie DllExport do C#. Ciekawe jako to działa - pewnie tłumaczy kod na C++/CLI i kompiluje.

1

Jednak spróbuje napisać wrapper do biblioteki DLL C# .NET.... Już aplikacje przerobiłem na DLL w C# .NET, wszystko się pięknie wywołuje w C++ CLI (managed), ale już w CA Visual Objects nie działa :/
Tylko teraz jak napisać taki wrapper? Żeby zaimportować funkcje .NET do biblioteki i wyeksportować te funkcje zrozumiale dla środowisk poza .NET...
Próbowałem użyć tego szablonu z linku, kompiluje się biblioteka DLL, no i niestety o ile biblioteka się wczytuje to przy wywołaniu funkcji jest błąd...
CA Visual Objects wyrzuca komunikat, że aplikacja została niewłaściwie zainicjowana...
Tą samą bibliotekę próbowałem też wczytać w natywnym C++ (mingw, framework wxWidgets), ale też nie działa...
Kod w CA Visual Objects
_DLL FUNCTION informacja() AS VOID PASCAL:UnmanagedExportLibrary2.informacja

a w C++


typedef void( * MYPROC )( void );
HINSTANCE hDll;

............................

hDll = LoadLibrary( "UnmanagedExportLibrary2.dll" );
if( hDll != NULL )
{
    informacja =( MYPROC ) GetProcAddress( hDll, "informacja" );
   
    if( informacja != NULL )
    {
        informacja();
    }
    else
    {
        wxMessageBox( wxT("Błąd wykonywania funkcji w bibliotece DLL. ") );   
    }
   
}
else
{
 wxMessageBox( wxT("Błąd wczytania biblioteki DLL. ") );   
}
	
}

Wyświetla komunikat Błąd wykonywania funkcji w bibliotece DLL.
:/

0

Hmm no tak. Po pierwsze to po co ładujesz to dynamicznie? Ładowanie statyczne jest łatwiejsze. Po drugie, zobacz czy w ogóle ta biblioteka dll coś eksportuje i czy to jest to co chcesz (przejrzyj eksporty w jakimś exescope np).

0

A czemu dynamicznie? Szczerze to nie wiem, jakoś tak z rozpędu... Szczerze mówiąc statycznie linkowałem biblioteki DLL tylko w Delphi...
Chociaż niektóre źródła twierdzą, że dynamiczne linkowanie jest wygodniejsze
http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/DLL/198
Co do wykorzystania bibliotek DLL tworzonych przy pomocy .NET (C#) w np. C++ natywnym czy innych środowiska to znalazłem już rozwiązanie. Trzeba było użyć dwóch narzędzi, ildasm, ilasm oraz zmodyfikować plik IL.
Tutaj jest opis :
http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm#InversePInvoke
oraz
http://keicam.wordpress.com/2008/06/17/eksport-funkcji-dll-w-c/

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