来自http://www.codeproject.com/Articles/49003/SCSI-Library-in-C-Burn-CDs-and-DVDs-Access-Hard-Di的第三方库(Helper.dll)使用.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类?
答案 0 :(得分:5)
使用Reflection来调用类的私有方法确实是在不同版本的.NET上使代码失败的好方法。在.NET 4.x中,Buffer类已更改,该方法现在名为_Memcpy
。
您可以通过使用每个版本的Windows上存在的DLL来获得该方法的更具弹性的版本,并且由于Windows本身使用它,因此已经加载到您的进程中。也不完全安全,微软有朝一日可能会更改DLL。但是不太可能,有很多使用它的开源工具(例如MinGW)。
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
private static unsafe extern int memcpy(byte* dest, byte* srce, int bytes);
答案 1 :(得分:1)
该库将使用您的应用程序的.NET版本。请参阅MSDN上的Version Compatibility in the .NET Framework。
如果您可以控制组件,只需修复它即可。永远不要依赖私人成员,而是重新实现他们。
如果您无法控制组件并且无法切换到.NET 2.0,则唯一的选择是将组件移动到单独的进程中。
答案 2 :(得分:-1)
非常感谢!我想我找到了#34; true"二手图书馆的来源和改变领域的理论化
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中运行,也许可以在未来几年内运行。