从本地C反向的PInvoke ++(Reverse PInvoke from native C++)

2019-08-06 07:40发布

目前我正在试图从非托管C ++应用程序调用从C#DLL函数。

搜索网络等等小时后,我发现我有几种选择。

我可以使用COM, DllExport ,或使用反向PInvoke的与代表。 最后响起最吸引我的,所以SO搜索后,我结束了在这里 。

它指出,文章介绍了如何使用反向PInvoke的,但它看起来像C#代码必须先导入C ++ DLL,然后才能使用它。

我需要能够使用C ++调用我的C#DLL函数,而无需首先运行一个C#应用程序。

也许逆转的PInvoke是不这样做的方式,但我很没有经验,当涉及到低层次的东西,所以就如何做到这一点的任何指针或建议将是巨大的。

在链接的代码

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);    
    }    
}

Answer 1:

咩,只是旋转起来自己的CLR主机和运行,你需要什么:

#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();
}


文章来源: Reverse PInvoke from native C++
标签: c# c++ pinvoke