2014-09-24 58 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,也許未來幾年。