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

Posted

技术标签:

【中文标题】让非托管 c++ 代码调用调用 c# 代码的托管 c++ 代码【英文标题】:Have Unmanaged c++ code call managed c++ code that calls c# code 【发布时间】:2016-04-21 22:35:52 【问题描述】:

我在弄清楚如何准确引用从非托管 c++ 代码调用 c# 代码的托管 c++ 代码时遇到了麻烦。让我抛出几个场景:

    我有我的非托管代码引用并调用我的托管代码,我的托管代码对我的 c# 代码的调用被注释掉,构建和工作正常。我取消注释我的 c# 代码,我现在收到编译器错误,说我的 c# 命名空间不存在。 在我的非托管代码中,我注释掉引用并调用我的托管代码。我的托管代码调用我的 c# 代码。构建和运行都很好...您可以从这里获得图片。

编译器错误为 C2653。

这就是我正在做的事情:

非托管 c++ 代码:我已将链接器设置为包含我的托管 c++ lib 文件。

#include "ManagedCpp.h"

ManagedCpp::foo();

托管 C++:

extern "C" __declspec(dllexport) void __stdcall foo()

    CssCode::bar();

C#

public static void bar()

    // From here it initializes some stuff from the registry 
    // into some data structures which I plan on marshaling 
    // back with other method calls, which I know involves placing
    // things on the stack that can be returned normally to the 
    // managed c++ code which then will need to be marshed back to the
    // unmanaged c++ code.
    // All code will be static.

我做错了什么?据我所知,我需要从非托管代码中隐藏我的 c# 调用,但我不太确定如何做到这一点。

【问题讨论】:

提供更多上下文。什么是编译器错误? CssCode类的定义是什么,即bar()方法?是public static 方法吗? 我将编辑帖子以提供更多信息。 您可以在同一个编译单元中混合使用非托管和托管 C++。无需将托管 C++ 移动到单独的 DLL 中。只是在说'。此外,您可以通过 COM 可见程序集或 CorXXX 系列 API 直接从非托管 C++ 调用 C# dll。 在这种情况下,我正在尝试与 CppUnitTestFramework 交互,因此设置我的非托管代码 /clr 标志会导致我必须使用的内部测试引擎无法找到这些测试,因此您的第一个建议是根据我的需要是不可行的。至于您的第二个建议,该任务的首席工程师架构师出于多种原因建议使用包装器方法,因此您的第二个解决方案由于比我自己的头脑更强大,我无法使用。 您是否从 C++ DLL 添加了对 C# 程序集的引用? 【参考方案1】:

空头错误。

我将来自托管 c++ 的调用放到标头中的 c# 代码中。哎呀。现在似乎一切正常!

【讨论】:

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

从 C# 线程调用非托管代码

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

从非托管 c++ 调用 C# 函数(通过托管包装器)

C# 调用非托管 C++ 返回平方符号字符串

使用平台调用(PInvoke)实现C#调用非托管C++代码

使用平台调用(PInvoke)实现C#调用非托管C++代码