problem z załadowaniem Managed Dll w natywnym C++

0

Witam,

Próbuję załadować funkcję z zarządzanej biblioteki według tego tutorialu http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9855.
W zarządzanym C++ mogę po prostu dodać sobie w referencjach i nie ma problemu z korzystaniem, natomiast gdy ręcznie spróbuję ją załadować dostaję AccesViolationException.

// Test - Classes.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <windows.h> 
#include <stdio.h> 

using namespace System;
using namespace std;

typedef int (*MultFunc)(int,int);


int main(array<System::String ^> ^args)
{
    HINSTANCE hDll = LoadLibrary(TEXT("D:\\Workbench\\Programming\\C#\\2010\\DLL\\DLL\\bin\\Debug\\DLL.dll"));
    if (hDll)
    {
	MultFunc multFunc = (MultFunc)GetProcAddress(hDll, "MultiplyIt");
        Console::WriteLine(multFunc(5, 6));
    }
    else
    {
        Console::WriteLine("Load Failed");
    }
    FreeLibrary(hDll);

    return 0;
}

A to kod DLL

using System;

namespace DLL
{
    static public class Class1
    {
        static public int MultiplyIt(int a, int b)
        {
            return a * b;
        }
    }
}

co robię nie tak ?

Będę wdzięczny za podpowiedzi.

0

Dllka zarzadzana to nie jest zwykla dllka, nie zaladujesz jej tak jak kazdej innej. W tym przypadku dllka zarzadzana musi eksportowac pozadana funkcje, tak, zeby bylo ja widac z punktu widzenia normalnej dllki systemowej. Albo musisz ja ladowac poprzez funkcje mscorlib, czyli przez .Net Framework.

0

Przecież twoje C++ też jest zarządzane (C++/CLI) więc jaki problem w referencji?

Ale jeśli chcesz załadować kod C# w natywnym programie C++, można użyć C++/CLI jako pomostu.

// C++/CLI, kompilować jako DLL z referencją do dll-ki zarządzanej.

using namespace DLL; // <-- kod w C#

__declspec(dllexport) int __cdecl MultiplyInt(int a,int b)
{
    return  Class1::MultiplyInt(a,b); // uruchom kod zarządzany
}

i taką dll-kę już bez problemu załadujemy z natywnego programu, i wywołamy MultiplyInt (które z kolei wywoła zarządzane Class1.MultiplyInt)

wadą jest, że dlle nam się mnożą, a oprócz .Net Framework nie unikniemy też zależności od C++ Runtime.

Zacznie się robić ciekawie, gdy będziemy potrzebowali wskaźników, strumieni, itp. Lepiej wtedy przepisać część kodu z C# na C++/CLI niż kombinować z kolejnymi warstwami opakowującymi.

0

Jeszcze nie wypróbowałem waszych podpowiedzi ale dziekuje za zainteresowanie.

Tak, próbka kodu którą zamieściłem jest z zarządzanego C++ ponieważ łatwiej testować w nim różne rozwiązania niż przełączać się między projektami.

Bardziej obeznany jestem z C# ale SDK programu który używam niestety używa C++ więc pomyślałem sobie że mógłbym część np. operatora/solvera tworzyć w C# i podpinać sobie w projekcie. Powód dla którego nie będę mógł stosować CLI/C++ jest prosty, Mono go nie obsługuje a może zajść taka sytuacja że na Linuxie będzie też musiało działać.

0

W takiej sytuacji lepiej będzie, jak napiszesz całość w natywnym C++, niż takie karkołomne kombinacje które mogą potem nie chodzić na Mono.

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