gpt4 book ai didi

c# - 如何从 native C++ 调用 C# 库(使用 C++\CLI 和 IJW)

转载 作者:IT老高 更新时间:2023-10-28 14:00:46 27 4
gpt4 key购买 nike

背景:作为更大任务的一部分,我需要使非托管 C++ 和 C 代码可以访问 C# 库。为了自己回答这个问题,过去几天/几周我一直在学习 C++/CLI。

似乎有许多不同的方法可以使用来自非托管 C++ 和 C 的 C# dll 来实现。一些简短的答案似乎是:使用 Interlope 服务、使用 .com。和 regasm,使用 PInvoke(它似乎只从 C# 转到 C++),并在 C++/CLR(它似乎是 Interlope 服务)中使用 IJW。我认为最好设置一个库,它可能是一个 CLR 包装器,它使用 IJW 代表 native C++ 和 C 代码调用我的 C# dll。

规范:我需要将字符串和 int 的值从 C++ 代码传递给 C# dll,并返回 void。

相关:许多公司有很多借口混合搭配 C++、C 和 C#。性能:非托管代码通常更快,接口(interface):托管接口(interface)通常更容易维护、部署,并且通常更容易看,经理也告诉我们。遗留代码也迫使我们这样做。它就在那里(就像我们爬过的山一样)。虽然如何从 C# 调用 C++ 库的示例很多。通过谷歌搜索很难找到如何从 C++ 代码调用 C# 库的示例,特别是如果您想查看更新的 4.0+ 代码。

软件: C#、C++/CLR、C++、C、Visual Studio 2010 和 .NET 4.0

问题详情:好的多部分问题:

  • 使用 com 对象有优势吗?还是 PInvoke?或者其他什么方法? (我觉得这里的学习曲线同样陡峭,即使我确实在 Google Land 中找到了有关该主题的更多信息。IJW 似乎 promise 了我想要它做的事情。我应该放弃寻找 IJW 解决方案吗?专注于此?)(优势/劣势?)
  • 我是否正确地想象有一个解决方案,我可以编写一个在 C++/CLR 中使用 IJW 的包装器?我在哪里可以找到关于这个主题的更多信息,不要说我没有足够的谷歌/或查看 MSDN 而不告诉我你在哪里看到它。 (我想我更喜欢这个选项,努力编写清晰简单的代码。)
  • 缩小问题范围:我觉得我真正的问题和需要是回答以下较小的问题:如何设置非托管 C++ 文件可以在 Visual Studio 中使用的 C++/CLR 库。我认为,如果我可以简单地在非托管 C++ 代码中实例化一个托管 C++ 类,那么我也许可以解决其余的问题(接口(interface)和包装等)。我希望我的主要愚蠢之处在于尝试在 Visual Studio 中设置引用/#includes 等,但显然我可能会有其他误解。也许这整个事情的答案可能只是一个指向帮助我解决这个问题的教程或说明的链接。

  • 研究:我一遍又一遍地用谷歌搜索和 Binged 并取得了一些成功。我找到了许多向您展示如何使用 C# 代码中的非托管库的链接。我承认已经有一些链接展示了如何使用 com 对象来做到这一点。针对 VS 2010 的结果并不多。

    引用文献:
    我一遍又一遍地阅读了许多帖子。我试图通过最相关的工作。有些似乎非常接近答案,但我似乎无法让它们发挥作用。我怀疑我缺少的东西非常小,例如滥用关键字 ref,或缺少 #include 或 using 语句,或滥用 namespace ,或实际上未正确使用 IJW 功能,或缺少 VS 的设置需要正确处理编译等。所以你想知道,为什么不包括代码?好吧,我觉得我不是在一个我理解并期望我必须工作的代码的地方。我想待在一个我能理解的地方,当我到达那里时,也许我需要帮助修复它。我将随机包含两个链接,但我不允许在当前的 Hitpoint 级别显示所有链接。

    http://www.codeproject.com/Articles/35437/Moving-Data-between-Managed-Code-and-Unmanaged-Cod

    这在从 C++ 到 Visual Basic 和通过 C++CLR 返回的两个方向上调用托管和非托管代码中的代码,当然我对 C# 感兴趣。: http://www.codeproject.com/Articles/9903/Calling-Managed-Code-from-Unmanaged-Code-and-vice

    最佳答案

    你可以很容易地做到这一点。

  • 创建 .h/.cpp 组合
  • 在新创建的 .cpp 文件上启用/clr。 (CPP -> 右键单击​​ -> 属性)
  • 将“附加#using 目录”的搜索路径设置为指向您的 C# dll。

  • 本地文件
    void NativeWrapMethod();

    native .cpp
    #using <mscorlib.dll>
    #using <MyNet.dll>

    using namespace MyNetNameSpace;

    void NativeWrapMethod()
    {
    MyNetNameSpace::MyManagedClass::Method(); // static method
    }

    这是将 C++\CLI 中的 C# 库与 native 代码一起使用的基础知识。 (只需在需要的地方引用 Native.h,然后调用该函数。)

    使用 C# 代码和托管 C++\CLI 代码大致相同。

    关于这个主题有很多错误信息,所以,希望这可以为某人省去很多麻烦。 :)

    我已经完成了:VS2010 - VS2012(它可能也适用于 VS2008。)

    关于c# - 如何从 native C++ 调用 C# 库(使用 C++\CLI 和 IJW),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13293888/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com