从 C++ 向后调用到 C#
A call backwards from C++ to C#
我正在使用C#的一个C++库,该库不是为使用其他语言而开发的,但现在很难更改某些内容。我正在使用 [DllImport] 调用,几乎所有内容都运行良好。
但是要知道我需要使用从 C++ 到 C# 的"向后"调用。因此,在 C# 中,我需要订阅 C++ 函数。在C++中,它是这样实现的:
INTF_API void __stdcall Intf_InstallHandler(Intf_MailHdlPtrType Hdl)
typedef void (STDCALL *Intf_MailHdlPtrType)(InstanceNoType instno,
const MailType* mail, rsuint16 mailsize);
(我已经从方法中删除了一些参数以使其更简单。它们是两个字节 - 不重要)所以在 C# 中我有:
public delegate void MailEventHandler(byte Instance, MailType Mail, UInt16 MailLength);
MailHandlerDef defHandler = (f) =>
{
var structure =
(MailType)Marshal.PtrToStructure(f, typeof(MailType));
handler(structure);
};
Externs.Intf_InstallMailHandler(defHandler);
[DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)]
public static extern void Intf_InstallMailHandler(byte Instance, [MarshalAs(UnmanagedType.FunctionPtr)] MailHandlerDef MailHandler, PrimitiveType Primitive);
我们有不同的原语(在 C++ dll 中,每个方法都是基元,每个方法都实现为调用和等待方法,或作为异步方法实现,其中 mailHandler 在计算结束时调用),并且所有原语都工作,除了一个。
如果调用此基元,则会引发 NullRef 异常,而不进行任何堆栈跟踪。而且我已经失去了理智,试图搜索导致这种情况的原因。有趣的是,这在我们的大型应用程序中不起作用(即使我试图关闭所有应用程序,只是在启动时调用它),但在我的小型测试应用程序上它可以工作。
任何帮助,不胜感激。
您可以使用
.Net CLI C++包装器,然后调用标准C++代码。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用