簡體   English   中英

使用第三方庫(帶有反射)的.NET應用程序。

[英].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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM