使用较旧.NET版本的第三方库(带反射)的.NET应用程序
本文关键字:NET 反射 应用程序 第三方 版本 | 更新日期: 2023-09-27 18:24:27
来自的第三方库(Helper.dll)http://www.codeproject.com/Articles/49003/SCSI-Library-in-C-Burn-CDs-and-DVDs-Access-Hard-Di使用.NET 2.0。主要应用程序使用.NET 4.5。库中有以下代码:
memcpyimpl = (memcpyimplDelegate) Delegate.CreateDelegate(typeof(memcpyimplDelegate), typeof(Buffer).GetMethod("memcpyimpl", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static));
其中
public unsafe delegate void memcpyimplDelegate(byte* src, byte* dest, int len);
运行时引发错误,因为此代码可能使用了最新程序集中的Buffer类,但.NET 4.5中没有Buffer.memcpyimpl方法。
如何使库使用.NET 2.0中的Buffer类?
使用反射调用类的私有方法确实是让代码在不同版本的.NET上失败的好方法。Buffer类在.NET 4.x中发生了更改,该方法现在命名为_Memcpy
。
您可以通过ab/使用每个版本的Windows上都存在的DLL来获得该方法的更具弹性的版本,并且由于Windows本身使用了该DLL,该DLL已经加载到您的进程中。也不是完全安全的,Microsoft可能有一天会更改该DLL。但不太可能,有很多开源工具使用它(例如MinGW)。
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
private static unsafe extern int memcpy(byte* dest, byte* srce, int bytes);
库将使用.NET版本的应用程序。请参阅MSDN上.NET Framework的版本兼容性。
如果你可以控制组件,只需修复它。永远不要依赖私人成员,而是重新实现它们。
如果您无法控制该组件,也无法切换到.NET 2.0,那么您唯一的选择就是将该组件移动到一个单独的进程中。
非常感谢!我想我找到了使用过的图书馆的"真实"来源,并将领域私有化为
public static readonly unsafe memcpyimplDelegate memcpyimpl =
(memcpyimplDelegate)Delegate.CreateDelegate(
typeof(memcpyimplDelegate),
typeof(Buffer).GetMethod("memcpyimpl",
BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
?? typeof(Buffer).GetMethod("Memcpy",
BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic,
null, new Type[] { typeof(byte*), typeof(byte*), typeof(int) }, null)
);
一点也不好(事实上非常糟糕),但它可以在.NET 4.0和4.5中运行,也许在未来几年内也可以。