2013-01-10 8 views
5

現在、アンマネージC++アプリケーションからC#DLLから関数を呼び出そうとしています。ネイティブC++から逆PInvoke

ウェブ上で時間を検索した後、私はいくつかの選択肢があることがわかりました。

私はCOM、DllExportを使用するか、代理人と逆PInvokeを使用できます。最後は私に最も魅力的だったので、SOを検索した後、私はhereになった。

この記事では逆PInvokeを使用する方法を示していますが、使用する前にC#コードを最初にインポートする必要があるようです。

まずC#アプリケーションを実行せずに、C++を使用してC#のDLL関数を呼び出す必要があります。

逆PInvokeはそれを行う方法ではないかもしれませんが、低レベルのものについては非常に経験がないので、これを行う方法に関するヒントやヒントは素晴らしいでしょう。

リンクのコードは、ちょうどあなた自身のCLRホストをスピンアップし、何を実行し、

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

最も単純なUnmanagedExportsです:https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports –

+0

何がやりたいことはC++からC#のDLLをホストしている場合は、[見ていませんでしたここに] [1]? [1]:http://stackoverflow.com/questions/3799907/using-c-sharp-dll-in-project-c – plinth

答えて

8

MEHですあなたは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

おかげで非常に多く、私は実際にコード例を感謝しています。唯一の問題は、mscoree.hが見つからないことです。プログラムファイルのsdkパスにありません。このヘッダがどこにあるのか、どこで取得できるのか分かりますか?再度、感謝します。 –

+0

@ bali-cは100%確かではありませんが、私はそれがフレームワークsdkの一部だと思います。 msdnから取得できます。 – JerKimball

+0

ありがとう、私はそれを見つけましたが、すべてのファイルをコピーした後、それはヘッダのエラーの全体的な負荷を思いついたと不満を抱いていました。私はCode :: Blocksを使用しています、それは大丈夫ですか?または私はVSを使用する必要がありますか?ありがとう! –

関連する問題