【问题标题】:Reverse PInvoke from native C++从本机 C++ 反向 PInvoke
【发布时间】:2013-01-11 08:25:09
【问题描述】:

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

在网上搜索了几个小时后,我发现我有几个选择。

我可以使用 COM、DllExport,或使用带委托的反向 PInvoke。最后一个听起来最吸引我,所以在搜索之后我最终找到了here

文章说文章展示了如何使用反向 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);    
    }    
}

【问题讨论】:

标签: c# c++ pinvoke


【解决方案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();
}

【讨论】:

  • 非常感谢,我非常感谢代码示例。唯一的问题是它找不到 mscoree.h,而且它不在我的程序文件的 sdk 路径中,你知道这个头文件应该在哪里或者我可以在哪里得到它吗?再次感谢。
  • @bali-c 不是 100% 确定,但我认为它是框架 sdk 的一部分。您可以从 msdn 获取它。
  • 谢谢,我找到了,但是在复制了它抱怨的所有文件后,在标题中出现了一大堆错误。我正在使用 Code::Blocks,可以吗?或者我应该使用VS?谢谢!
  • @BaliC 我对 Code::Blocks 还不够熟悉,无法真正说 - 我用 VS 编译这个没问题,但我想有一些在线指南会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 2015-09-19
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多