【问题标题】:Load Managed C++ Dll from Unmanaged C Dll?从非托管 C Dll 加载托管 C++ Dll?
【发布时间】:2013-12-10 17:47:20
【问题描述】:

我有一个现成的产品,它支持需要用非托管 C 编写的自定义插件。它不支持托管 Dll,我的首选语言是 c#。

需要传回现成产品的信息非常基本,可以保存在字符串中。

所以我想我可以做到以下几点:

  1. 在 C# Dll 中编写我的大部分代码。
  2. 在调用我的 C# 方法的 C++ 托管代码中编写一个包装器。
  3. 用非托管 C 编写一个基本 Dll,调用托管 C++ Dll。

现在托管 C++ 和 C# Dll 之间的通信很容易。

但我不知道如何从非托管 c dll 调用托管 c++ 函数。 任何对一些简单示例代码的帮助都会很棒。

谢谢

编辑: 我创建了一篇代码项目文章,介绍了我是如何使用下面 Alex 的回答做到这一点的。 http://www.codeproject.com/Tips/695387/Calling-Csharp-NET-methods-from-unmanaged-code

【问题讨论】:

    标签: c# c++ unmanaged managed


    【解决方案1】:

    你几乎猜对了。只需将数字 2 和 3 放在同一个 C++/CLI DLL 中。您既可以使用 .NET 类,也可以从 C++/CLI 项目中导出 C 函数。

    extern "C" __declspec( dllexport ) void __stdcall PureExportC(
                                                        const wchar_t* param
    )
    {
        CSharpAssemblyNamespace::CSharpWorker worker;
        worker.DoWork( gcnew String(param) );
    }
    

    【讨论】:

    • 英雄。很棒的东西。
    • 这只是一个快速的。 C# Dll 现在需要位于原始应用程序的当前目录中。而不是在 C++ Dll 的当前目录中。知道如何改变吗?
    • @CathalMF 您可能可以将 C# 和 C++/CLI 程序集链接在一起,并且只获得一个 DLL。我还没有尝试过,但this answerILMerge 可能会起作用。
    【解决方案2】:

    我不认为,你可以做到这一点。但是您可以为该产品编写一个 c++(非托管)插件。然后用 c# 编写一个独立的托管应用程序,从插件启动它并使用命名管道或套接字在它们之间进行通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2010-10-14
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2013-01-05
      相关资源
      最近更新 更多