让非托管 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++ 代码的主要内容,如果未能解决你的问题,请参考以下文章