从非托管 c++ 调用托管 c# 函数

Posted

技术标签:

【中文标题】从非托管 c++ 调用托管 c# 函数【英文标题】:calling managed c# functions from unmanaged c++ 【发布时间】:2010-04-27 09:17:58 【问题描述】:

如何

【问题讨论】:

见***.com/questions/1802929/… 【参考方案1】:

或者使用project of mine 允许C# 创建非托管导出。可以像使用母语一样使用它们。

【讨论】:

嗨,这看起来很有趣。你有 VS 2010 的版本吗,或者你能指出我需要做哪些更改才能使其可用于 VS 2010 / Net 4?谢谢 应该可以正常工作(我自己在 2010 年使用它),但是您可能希望将新创建的项目的目标框架更改为 4.0。当没有目标框架设置时,VS 2010 默认为 .Net 2.0。 谢谢,太好了。我看到了(我创建了一个示例测试空项目,但尚未测试它是否有效) 你好罗伯特。我正在使用您的项目,一切正常,除非 C# 函数返回字符串 []。我收到一个错误:未处理的异常:System.Runtime.InteropServices.MarshalDirectiveException:无法封送“返回值”:托管/非托管类型组合无效。在您的项目页面上,没有将数组作为返回类型处理的示例。有没有什么例子可以让我看到如何在 C++ 中获取字符串数组?提前致谢。【参考方案2】:

我首先使用 COM 互操作,但现在我切换到 IJW(它可以正常工作),因为它更简单。我有一个包装 C++/CLR DLL(用 /clr 编译)。

一个简单的例子(使用静态使调用更容易):

namespace MyClasses       

    public class MyClass
    
        public static void DoSomething()
        
            MessageBox.Show("Hello World");
        
    

在 DLL 中,我可以按如下方式引用命名空间:

using namespace MyClasses;

并称它为:

__declspec(dllexport) void CallManagedCode()

    MyClass::DoSomething();

现在您有一个非托管 DLL 导出“CallManagedCode”,它调用托管代码。

当然,您还必须在托管/非托管边界之间转换数据。从 VS2008 开始,Microsoft 包含一个 marshal-helper 用于在非托管类型和托管类型之间进行转换。见http://msdn.microsoft.com/en-us/library/bb384865.aspx

【讨论】:

您实际上不必手动走这条路线。查看我回复中的链接。完全有可能在 c# 中拥有 DllImport 的对应物,包括 .Net 附带的所有编组优点。我的 MSBuild 任务在构建后添加了适当的 vt-fixups,您不需要部署另一个程序集... 我试过了:DLL 有出口。但是,我应该如何使用它?我没有找到允许我链接到 DLL 的 .lib。 我不使用 C++,但我想这与您对任何不带有 C/C++ 头文件的库所做的没什么不同:为您想要的函数编写头文件自己导入。正如我所说,我不使用 C++。使用 C 或 Delphi 非常简单。 标题不是问题。要链接到库,您需要一个 .lib,否则每次调用都必须使用 LoadLibrary() 和 GetProcAddress()。我通过手动生成一个 .def 并从中生成一个 .lib 来“解决”它,如support.microsoft.com/kb/131313 同样,方法调用本身失败(使调用 UI 线程安全时的标准用例)。我可以通过电子邮件与您联系吗?我在任何地方都没有找到地址。【参考方案3】:

我使用了 C++/CLI 包装类 described here,实现起来相对容易。

【讨论】:

请在此处发布解决方案或至少对其进行摘要。该链接将来可能会断开。而且在这里阅读所有解决方案也更容易。如果它们不止一个,您可以将它们作为多个答案发布。谢谢! ;)【参考方案4】:

RE:如何从非托管 C++ 应用程序调用托管 C# 代码?

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.interop/2005-05/msg00030.html

从非托管 C++ 代码调用托管 .NET C# COM 对象 ...

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

在非托管 C++ 项目中包装托管 C# DLL:dll。

http://www.experts-exchange.com/Programming/Languages/.NET/Q_22006727.html

【讨论】:

我按照您提供的第二个链接成功编译了 cpp 文件,但未能运行它。它使用智能指针在 CreateInstance() 失败.....所以我无法调用 c# dll 的函数 请在此处发布解决方案或至少对其进行摘要。该链接将来可能会断开。而且在这里阅读所有解决方案也更容易。如果它们不止一个,您可以将它们作为多个答案发布。谢谢! ;)

以上是关于从非托管 c++ 调用托管 c# 函数的主要内容,如果未能解决你的问题,请参考以下文章

从非托管 c++ 调用托管 c# 函数

调试从非托管 C++ 调用的托管 .NET 代码

从非托管 C++ mfc active x dll 启动 C# 对话框

让非托管 c++ 代码调用调用 c# 代码的托管 c++ 代码

如何从非托管 C++ 代码获取结构化列表值到 C#?

将数组从非托管 C++ 传递到 C#