我在用DllImport
在我的解决方案中。
我的问题是我有同一个 DLL 的两个版本,一个是为 32 位构建的,另一个是为 64 位构建的。
它们都公开具有相同名称和相同签名的相同函数。
我的问题是我必须使用两个静态方法来公开这些方法,然后在运行时使用IntPtr
大小来确定要调用的正确值。
private static class Ccf_32
{
[DllImport(myDllName32)]
public static extern int func1();
}
private static class Ccf_64
{
[DllImport(myDllName64)]
public static extern int func1();
}
我必须这样做,因为myDllName32
and myDllName64
必须是恒定的,我还没有找到在运行时设置它的方法。
有谁对此有一个优雅的解决方案,这样我就可以摆脱代码重复和常量IntPtr
尺寸检查。
如果我可以设置文件名,我只需要检查一次,就可以摆脱大量重复的代码。
我更喜欢使用加载库从 kernel32.dll 调用以强制从特定路径加载特定 DLL。
如果您将 32 位和 64 位 DLL 命名相同,但将它们放置在不同的路径中,则可以使用以下代码根据您运行的 Windows 版本加载正确的代码。您所需要做的就是致电示例DllLoader.LoadDll()在引用任何代码之前ccf类被引用:
private static class ccf
{
[DllImport("myDllName")]
public static extern int func1();
}
public static class ExampleDllLoader
{
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
private extern static IntPtr LoadLibrary(string librayName);
public static void LoadDll()
{
String path;
//IntPtr.Size will be 4 in 32-bit processes, 8 in 64-bit processes
if (IntPtr.Size == 4)
path = "c:/example32bitpath/myDllName.dll";
else
path = "c:/example64bitpath/myDllName.dll";
LoadLibrary(path);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)