2013-01-10 12 views
5

Obecnie próbuję wywołać funkcję z biblioteki DLL C# z niezarządzanej aplikacji C++.Reverse PInvoke z natywnego C++

Po wyszukiwaniu godzin w Internecie i SO, znalazłem, że mam kilka opcji.

Mogę użyć COM, DllExport lub użyć odwrotnego wywołania PInvoke z delegatami. Ostatnia brzmiała dla mnie najlepiej, więc po wyszukaniu SO skończyło mi się here.

Stwierdza, że ​​artykuł pokazuje, jak korzystać z odwrotnego wywołania, ale wygląda na to, że kod C# musi najpierw zaimportować bibliotekę C++, zanim będzie można go użyć.

Potrzebuję móc używać C++ do wywoływania moich funkcji C# Dll bez uruchamiania aplikacji C#.

Może to odwrotne PInvoke nie jest sposobem, aby to zrobić, ale jestem dość niedoświadczony, jeśli chodzi o rzeczy o niskim poziomie, więc wszelkie wskazówki i wskazówki, jak to zrobić byłoby świetnie.

Kod w linku jest

C#

using System.Runtime.InteropServices; 

public class foo  
{  
    public delegate void callback(string str); 

    public static void callee(string str)  
    {  
     System.Console.WriteLine("Managed: " +str);  
    } 

    public static int Main()  
    {  
     caller("Hello World!", 10, new callback(foo.callee));  
     return 0;  
    } 

    [DllImport("nat.dll",CallingConvention=CallingConvention.StdCall)]  
    public static extern void caller(string str, int count, callback call);  
} 

C++

#include <stdio.h>  
#include <string.h> 

typedef void (__stdcall *callback)(wchar_t * str);  
extern "C" __declspec(dllexport) void __stdcall caller(wchar_t * input, int count, callback call)  
{  
    for(int i = 0; i < count; i++)  
    {  
     call(input);  
    }  
} 
+2

Najprościej UnmanagedExports: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports –

+0

Jeśli to, co chcesz zrobić, to zorganizować dll C# od C++, nie wyglądasz [ tutaj] [1]? [1]: http://stackoverflow.com/questions/3799907/using-c-sharp-dll-in-project-c – plinth

Odpowiedz

8

Meh, tylko kręcić własnego hosta CLR i uruchomić co potrzebujesz t O:

#include <mscoree.h> 
#include <stdio.h> 
#pragma comment(lib, "mscoree.lib") 

void Bootstrap() 
{ 
    ICLRRuntimeHost *pHost = NULL; 
    HRESULT hr = CorBindToRuntimeEx(L"v4.0.30319", L"wks", 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*)&pHost); 
    pHost->Start(); 
    printf("HRESULT:%x\n", hr); 

    // target method MUST be static int method(string arg) 
    DWORD dwRet = 0; 
    hr = pHost->ExecuteInDefaultAppDomain(L"c:\\temp\\test.dll", L"Test.Hello", L"SayHello", L"Person!", &dwRet); 
    printf("HRESULT:%x\n", hr); 

    hr = pHost->Stop(); 
    printf("HRESULT:%x\n", hr); 

    pHost->Release(); 
} 

int main() 
{ 
    Bootstrap(); 
} 
+0

Dziękuję bardzo, naprawdę docenić przykład kodu. Jedynym problemem jest to, że nie może znaleźć mscoree.h, i nie ma go w mojej ścieżce sdk w plikach programu, czy wiesz, gdzie powinien być ten nagłówek lub skąd mogę go pobrać? Dzięki jeszcze raz. –

+0

@ bali-c nie jest w 100% pewny, ale myślę, że to część struktury sdk. Możesz go pobrać z msdn. – JerKimball

+0

Dzięki, znalazłem, ale po skopiowaniu wszystkich plików, na które narzekałem, pojawił się cały ładunek błędów w nagłówkach. Używam Code :: Blocks, czy to w porządku? Czy powinienem używać VS? Dzięki! –