2014-09-24 64 views
2

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。 有下面的代码库:使用第三方库(带反射)的.NET应用程序旧版本.NET版本

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类,但没有Buffer.memcpyimpl方法.NET 4.5。

如何让库使用.NET 2.0中的Buffer类?

回答

1

该库将使用您的应用的.NET版本。请参阅MSDN上的Version Compatibility in the .NET Framework

如果您可以控制组件,只需修复它。永远不要依赖私人成员,而是重新实现它们。

如果您无法控制组件并且无法切换到.NET 2.0,那么您唯一的选择是将组件移动到单独的进程中。

5

使用反射调用类的私有方法确实是让代码在不同版本的.NET上失败的好方法。缓冲类在.NET 4.x中已更改,现在该方法名为_Memcpy

您可以通过ab /使用每个版本的Windows上存在的DLL获得该方法的更具弹性的版本,并且自从Windows本身使用它之后,它将已经加载到您的进程中。不是完全安全的,微软可能会在某天改变DLL。但不太可能,有很多使用它的开源工具(例如MinGW)。

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] 
    private static unsafe extern int memcpy(byte* dest, byte* srce, int bytes); 
-1

非常感谢!我想我找到旧图书馆和变化领域inicialization的“真”来源

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,也许未来几年。

相关问题