首页 / C# / c# – 将字符串从非托管代码传递给托管
c# – 将字符串从非托管代码传递给托管
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 将字符串从非托管代码传递给托管,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1961字,纯文字阅读大概需要3分钟。
内容图文
![c# – 将字符串从非托管代码传递给托管](/upload/InfoBanner/zyjiaocheng/800/1e5c703ec2f14d74a243c84db206f0e2.jpg)
我将字符串从非托管代码传递给托管有问题.
在我的非托管类(unmanagedClass.cpp)中,我有一个指向托管代码函数的指针:
TESTCALLBACK_FUNCTION testCbFunc;
TESTCALLBACK_FUNCTION接受一个字符串并且不返回任何内容:
typedef void (*TESTCALLBACK_FUNCTION )(char* msg);
非托管类继承自ITest接口,该接口只有一个方法:
STDMETHOD(put_TestCallBack) (THIS_
LPVOID FnAddress
) PURE;
在managedClass.cs中,我编写了这段代码:
public class ManagedClass
{
ITest unmanaged = new unmanagedClass();
public delegate void TestDelegate(string info);
ManagedClass()
{
unmanaged.put_TestCallBack(new TestDelegate(this.Test));
}
void Test(string info)
{
MessageBox.Show(info);
}
}
[ComImport, Guid("<my guid here>")]
public class unmanagedClass
{
}
[ComImport, System.Security.SuppressUnmanagedCodeSecurity,
Guid("<my guid here>"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITest
{
[PreserveSig]
int put_TestCallBack([MarshalAs(UnmanagedType.FunctionPtr), In] Capture.TestDelegate func);
}
要从非托管代码调用Test func,我使用它
(*testCbFunc)("Func Uragan33::Execute has been started!");
但是当调用来自managedClass.cs的Test方法时,我总是收到空字符串.
为什么会这样?
预先感谢!
解决方法:
您在调用约定上不匹配. C代码中的typedef声明了一个带有默认调用约定的函数指针,即__cdecl.但是托管代码中委托的默认值是__stdcall.
你需要一个属性告诉pinvoke marshaller.看起来像这样:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void TestDelegate(string info);
在函数声明中删除[MarshalAs].修复C代码中的typedef可能更好,如果可以的话,明确地使所有内容保持一致是首选解决方案:
typedef void (__stdcall * TESTCALLBACK_FUNCTION )(char* msg);
不相关,这是一个你需要修复的错误:
unmanaged.put_TestCallBack(new TestDelegate(this.Test));
您创建的委托对象对垃圾收集器不可见.如果将在下一个GC上收集,则当本机代码进行回调时,您的代码将崩溃.您必须将委托对象存储在某处,以便GC始终看到引用.要么作为类中的字段,要求类对象需要保持足够长的时间,要么保持静态变量.
请注意当您声明回调接口而不是委托时,所有这些问题是如何消失的. COM的方式.
内容总结
以上是互联网集市为您收集整理的c# – 将字符串从非托管代码传递给托管全部内容,希望文章能够帮你解决c# – 将字符串从非托管代码传递给托管所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。