.NET应用程序使用第三方库(带反射)较旧的.NET版本

时间:2014-09-24 12:10:27

标签: c# .net reflection

来自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类?

3 个答案:

答案 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中运行,也许可以在未来几年内运行。