我编写了一个 C# 应用程序,它通过托管 c++ dll 使用非托管 c++ dll。在非托管 dll 中,有一个回调,它的参数之一是std::string&
.
我似乎找不到用托管 dll 包装它的正确方法。当我使用String^
时,回调有效,但 C# 应用程序在字符串中没有得到任何东西。当我使用String^%
时,在其他似乎不相关的地方开始崩溃(可能是内存损坏)。
所以我的问题是,这样做的正确方法是什么?
谢谢
我不能在这里复制粘贴代码,但我会再次尝试解释。我不能在托管 c++ 部分中使用封送处理,因为我没有调用函数,而是将 ac# 委托传递给回调。
在非托管 dll 中,我有一个回调,需要这样的函数:void Func(unsigned int, int, std:string &)
.
我的目标是将 ac# 委托从我的程序传递给该回调,因此在非托管代码中,我制作了这样的委托:delegate void DEL(unsigned int a, int b, String ^ c)
和类似的函数:void mFunc(DEL ^ del)
,并且该函数编组将委托转换为非托管回调订阅函数接受的 cb . unsigned int 和 int 工作正常,但字符串总是""
在触发 C# 函数时。
发布一些代码可以帮助我更好地理解并给出更好的答案;但是没有将 String^ 自动转换或编组为 std::string。您需要自己编组以将字符串返回到 C# 代码。快速搜索可以提供有关如何执行此操作的详细信息。
我不相信编组可以处理 std::string。我认为您需要制作自己的传递 char * 的回调,然后编写两者之间的胶水代码。
此外,一旦将委托编组到回调中,该回调就不会算作对可能已生成委托的对象的引用。因此,如果委托不是静态方法,则需要在非托管回调的生命周期内将其填充到某个地方。