动态设置 DllImport 属性
我正在使用 PInvoke 和 DllImport 属性来使用外部非托管 dll。例如。
[DllImport("mcs_apiD.dll", CharSet = CharSet.Auto)]
private static extern byte start_api(byte pid, byte stat, byte dbg, byte ka);
我想知道是否可以以某种方式动态更改 dll 文件详细信息(本例中为 mcs_apiD.dll),例如,如果我想针对另一个 dll 版本进行构建
I am making use of an external unmanaged dll using PInvoke and the DllImport attribute. eg.
[DllImport("mcs_apiD.dll", CharSet = CharSet.Auto)]
private static extern byte start_api(byte pid, byte stat, byte dbg, byte ka);
I am wondering if it is possible to alter the dll file details (mcs_apiD.dll in this example) dynmically in some manner, if for instance I wanted to build against another dll version
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的,这是可能的,您必须完成 P/Invoke 编组器所做的部分工作。加载 DLL 并找到导出函数的入口点。首先声明一个签名与导出函数匹配的委托:
然后使用如下代码:
当然有很多方法会出错。请注意,您必须使用 DLL 中实际导出的名称,您不再获得 P/Invoke 编组器的帮助来帮助进行名称修饰。如果您不确定导出名称是什么样子,请在 DLL 上使用 dumpbin.exe /exports。
Yes this is possible, you'll have to do part of the job that the P/Invoke marshaller does. Loading the DLL and finding the entry point of the exported function. Start by declaring a delegate whose signature matches the exported function:
Then use code like this:
Lots of ways to get this wrong of course. Do note that you have to use the actual exported name from the DLL, you no longer get the help from the P/Invoke marshaller to help with name decoration. Use dumpbin.exe /exports on the DLL if you are not sure what the export name looks like.
您无法更改 dll 的名称,但可以更改正在加载的库的路径(例如从注册表或配置文件中读取它)并使用
LoadLibrary
kernel32 的函数手动加载它: 在那里查看我的答案。you can't change the name of the dll but you can alter the path of the library being loaded (like by reading it from the registry or a configuration file) and load it manually with
LoadLibrary
kernel32's function: see my answer there.