c# i ładowanie funkcji pisanej w asm z dll

0

problem jak w temacie..., poprzedniego wątku jakoś nie złapało:/
no więc mam program napisany w c#, mam te samo zadanie wykonać w HLL(c#) oraz w LLL(asm)
dane przygotowane do obróbki w c#, algorytm wykonany w c#, dllka z funkcją napisaną w asm obrabiającą w zamierzony sposób dane.
i jak to teraz wszystko w całość połączyć, znaczy jak załadować dynamicznie dllkę do programu napisanego w C#?
czy konieczne jest używanie do tego jakiejś zewnętrznej klasy która mi tutaj ni w ząb nie pasuje? czy da się to jakoś inaczej rozwiązać, po prostu ładując tę funkcję kiedy będzie potrzebna?

proszę o radę.

0

Jak funkcja jest w poprawny sposób wyeksportowana z biblioteki to zwykłe P/Invoke da radę.

Zadbanie o poprawne wyeksportowanie funkcji można zostawić Visual C++ i stworzyć w nim zwykłą bibliotekę oraz stworzyć np. taki szkielet funkcji:

extern "C" __declspec(dllexport) int __stdcall AsmFunction(int value)
{
	_asm
	{
		mov eax, value
		inc eax
	}
}

Wynik oczywiście ląduje w eax.

A w C# zaimportować ją przez P/Invoke:

[DllImport("C++ Project.dll")]
static extern int AsmFunction(int value);

static void Main(string[] args)
{
    int value = int.Parse(Console.ReadLine()); 
    int result = AsmFunction(value);
    Console.WriteLine(result);
    Console.ReadKey(true);
}
0

Trochę nie zrozumiałem.

Natomiast szukam od jakiegoś czasu jak załadować dynamicznie funkcję siedzącą w dllce do programu napisanego w asm.

A temat: "C# i funkcja z DLL". Sądząc po dalszej treści chodzi jednak o C#.

DLL-ka nie jest napisana w C# jak mniemam? Potrzebujesz zatem Platform Invoke i instrukcji DllImport.

Przykładowo dla funkcji w DLL, która jest eksportowana w taki sposób:

extern "C" __declspec(dllexport) __cdecl int sum(int a,int b);

import w C# wygląda tak:

[DllImport("TestDll.dll", EntryPoint="sum",
ExactSpelling=false,CallingConvention=CallingConvention.Cdecl)]
static extern int sum(int a,int b);

Coś jednak piszesz o dynamicznym ładowaniu - potrzebujesz zrobić to w stylu C, via LoadLibrary()/GetProcAddress() i tak dalej?
Pomóc może http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx, ale i tak musisz deklarować delegat dla każdej używanej funkcji. Nie wiem czy to się zmieniło od 2006 roku...

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