[英].NET application using third-party library (with reflection) older .NET version
來自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類?
使用反射調用類的私有方法確實是使代碼在其他版本的.NET上失敗的好方法。 .NET 4.x中的Buffer類已更改,該方法現在名為_Memcpy
。
您可以通過a /使用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中運行,甚至可能在未來幾年內運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.