标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。