1

我编写了一个 C# 应用程序,它通过托管 c++ dll 使用非托管 c++ dll。在非托管 dll 中,有一个回调,它的参数之一是std::string&.

我似乎找不到用托管 dll 包装它的正确方法。当我使用String^时,回调有效,但 C# 应用程序在字符串中没有得到任何东西。当我使用String^%时,在其他似乎不相关的地方开始崩溃(可能是内存损坏)。

所以我的问题是,这样做的正确方法是什么?

谢谢

4

3 回答 3

1

我不能在这里复制粘贴代码,但我会再次尝试解释。我不能在托管 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# 函数时。

于 2009-11-19T06:26:15.233 回答
0

发布一些代码可以帮助我更好地理解并给出更好的答案;但是没有将 String^ 自动转换或编组为 std::string。您需要自己编组以将字符串返回到 C# 代码。快速搜索可以提供有关如何执行此操作的详细信息。

http://msdn.microsoft.com/en-us/library/42zy2z41.aspx

于 2009-11-18T14:07:14.343 回答
0

我不相信编组可以处理 std::string。我认为您需要制作自己的传递 char * 的回调,然后编写两者之间的胶水代码。

此外,一旦将委托编组到回调中,该回调就不会算作对可能已生成委托的对象的引用。因此,如果委托不是静态方法,则需要在非托管回调的生命周期内将其填充到某个地方。

于 2009-11-19T22:46:14.857 回答