2010-05-17 13 views
8

W niezarządzanym świecie udało mi się napisać __declspec (dllexport) lub, alternatywnie, użyć pliku .DEF, aby odsłonić funkcję, aby móc wywołać bibliotekę DLL. (Z powodu wymazania nazw w C++ dla __stdcall, wstawiam aliasy do pliku .DEF, aby niektóre aplikacje mogły ponownie używać niektórych wyeksportowanych funkcji DLL.) Teraz jestem zainteresowany możliwością odsłonięcia pojedynczej funkcji punktu wejścia od Kompilacja .NET, w sposób niezarządzany, ale ma ona dostęp do funkcji .NET w bibliotece DLL. Czy to możliwe, w prosty i prosty sposób?Jak wywołać biblioteki DLL C++/CLI (.NET) ze standardowych, niezarządzanych aplikacji innych niż .NET?

To, co mam, to program innej firmy, który rozszerzyłem poprzez biblioteki DLL (wtyczki), które implementują skomplikowaną matematykę. Jednak program innej firmy nie ma możliwości wizualizacji obliczeń. Chcę jakoś wziąć te wstępnie napisane funkcje matematyczne, skompilować je do oddzielnej biblioteki DLL (ale przy użyciu C++/CLI w .NET), ale następnie dodać hooks do funkcji, dzięki czemu mogę renderować, co się dzieje pod maską w .NET kontrola użytkownika. Nie jestem pewien, jak połączyć elementy platformy .NET z niezarządzanymi materiałami lub co Google wykona to zadanie.

Szczególne sugestie dotyczące zarządzanego/niezarządzanego pomostu lub alternatywne metody realizacji renderowania w opisany przeze mnie sposób będą pomocne. Dziękuję Ci.

Odpowiedz

4

Czy używasz C++/CLI, ponieważ chcesz, lub ponieważ uważasz, że musisz eksportować funkcje?

W przypadku tego drugiego, sprawdź mój unmanaged exports, który pozwala zadeklarować eksport niezarządzany w C# równoważny z działaniem DllImport.

internal class Sample 
{ 
    [DllExport("_export_test", CallingConvention.Cdecl)] 
    static int Test(int a) 
    { 
    return a + 1; 
    } 
} 
+0

chciałem użyć C++/CLI, ponieważ biblioteka trzeciej partia kompilacji automatycznie tylko przy użyciu opcji/CLR. Następnie dodanie powiązań do platformy .NET znacznie poprawiłoby życie (chyba.). Twój przykład wydaje się rozsądnym podejściem. Dziękuję Ci. – user343400

+0

Nie jestem pewien, czy śledzę cię tutaj. Kiedy weźmiesz mój szablon projektu, skompiluje się on również automatycznie (utworzy nawet plik .lib). Z wyjątkiem sytuacji, gdy źle cię zrozumiałem, a właściwie chcesz używać C++/CLI. –

4

Cóż, kompilator C++/CLI sprawia, że ​​to całkiem proste. Po prostu napisz statycznie zarządzaną funkcję i przypisz ją do __declspec (dllexport). Kompilator wstrzykuje kod pośredniczący, który automatycznie ładuje CLR w celu wykonania zarządzanego kodu.

To praktyczne podejście, nie jest bardzo rozszerzalne i nie będzie bardzo szybkie. Następnym krokiem jest napisanie klasy ref z atrybutem [ComVisible (true)]. Po zarejestrowaniu go w Regasm.exe dowolny niezarządzany klient obsługujący protokół COM może korzystać z tego serwera. Samo hostowanie CLR (CorBindToRuntimeEx) jest zwykle ostatnim wyborem, ale najbardziej uniwersalnym.


Przykładowy kod:

ref class ManagedClass { 
public: 
    static void StaticFunc() {} 
}; 

extern "C" __declspec(dllexport) 
void __stdcall UnmanagedFunc() { 
    ManagedClass::StaticFunc(); 
} 
+0

Jeśli potrzebuję __stdcall na nazwie i chcę pozbyć się @ numer na mangling nazwy i trzeba utworzyć alias w pliku .DEF, jak mam to zrobić w tym przypadku? Potrzebuję podpisu zewnętrznego w stylu "C", aby można go było wywołać za pomocą określonego typu aplikacji innej firmy. – user343400

+0

Po prostu użyj extern "C" i deklaratorów __stdcall na eksport. Nie potrzebujesz pliku .def. Próbka wysłana. –

+0

@HansPassant Co masz na myśli przez "kompilator wstrzykuje stub"? Czy kompilator generuje plik .lib (a wywołujący UnmanagedFunc() musiałby połączyć się z biblioteką)? – qqqqq

Powiązane problemy