ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

从C#设置非托管C dll的公共字段

2019-06-13 15:05:22  阅读:253  来源: 互联网

标签:c delegates interop dll dllimport


我正在为一个非托管的C dll编写一个C#绑定.

该DLL提供了5个钩子来返回几个数据:

typedef void (*t_libpd_printhook)(const char *recv);

并导出如下字段:

 EXTERN t_libpd_printhook libpd_printhook;

现在我使用Interop Assistant生成绑定代码,这给了我一个委托定义:

public delegate void t_libpd_printhook([In] [MarshalAs(UnmanagedType.LPStr)] string recv);

那么我可以使用一些神奇的Interop函数调用来设置DLL中的t_libpd_printhook字段吗?

解决方法:

您可以使用LoadLibrary和GetProcAddress获取指向导出的libpd_printhook变量的指针.然后,您可以使用Marshal.WriteIntPtr和Marshal.GetFunctionPointerForDelegate分配给委托.

[DllImport("kernel32", SetLastError=true, CharSet=CharSet.Unicode)]
static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true, 
    SetLastError=true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);

.....

IntPtr lib = LoadLibrary(@"mydll.dll");
IntPtr plibpd_printhook = GetProcAddress(lib, "libpd_printhook");
Marshal.WriteIntPtr(plibpd_printhook, 
    Marshal.GetFunctionPointerForDelegate(mydelegate));
FreeLibrary(lib);

您将需要添加我为了简洁示例而删除的错误检查.

现在,如果您控制非托管库,我仍然建议添加一个函数来封装写入此函数指针.这感觉就像是一个更好的界面.

标签:c,delegates,interop,dll,dllimport
来源: https://codeday.me/bug/20190613/1233664.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有