Ładowanie w C# biblioteki DLL, napisanej w C++

0

Witam, napisałem w C++ dll'ke, która udostępnia trochę ciekawych funkcji. Wczytuję ją pod C# w taki sposób:

[DllImport("mathdll.dll")]
public static extern int Potega(int a, int b);
[DllImport("mathdll.dll")]
public static extern int Kwadrat(int a);
[DllImport("mathdll.dll")] 
public static extern int Dodaj(int a, int b);
[DllImport("mathdll.dll")]
public static extern int Odejmij(int a, int b);

i funkcje ładnie działają, ale czy da się to zrobić jakoś szybciej tzn. żeby nie wklepywać cały czas tej linijki z DllImport'em ? (Jak jej nie ma przy kolejnej funkcji to mam błąd podczas debugowania).

Cannot intercept exception. Debugged program can not be continued and properties can not be evaluated.
System.TypeLoadException: Nie można załadować typu 'testdll.Program' z zestawu 'testdll, Version=1.0.5297.26280, Culture=neutral, PublicKeyToken=null', ponieważ metoda Odejmij' nie ma implementacji (adresu RVA).

0

Możesz użyć CTRL-C/CTRL-V, jeżeli nie chcesz ręcznie wpisywać tego atrybutu dla każdej importowanej funkcji.

Jakbyś się uparł to mógłbyś zrobić jakiś rewriting bytecode'u dla wszystkich metod z danej klasy albo zrobić P/Invoke kompletnie sam za pomocą LoadLibrary / GetProcAddress, ale na 99,99% będzie to więcej roboty niż... CTRL-C/CTRL-V.

0

Zawsze możesz skompilować to do C++ z mangled names i napisać sobie interpreter, który skonwertuje nazwy funkcji i ich parametrów do formatu akceptowanego przez C#

http://en.wikipedia.org/wiki/Visual_C%2B%2B_name_mangling

Jest nawet gotowy tools dla VC++, który może Ci pomóc jakbyś tych metod miał setki

http://stackoverflow.com/questions/9177591/how-to-undecorate-name-from-decorated-name

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