簡體   English   中英

Activator.CreateInstance(Type) 作為接口返回 null

[英]Activator.CreateInstance(Type) as Interface returns null

我把這個作為我的 dll 的主要 class:

namespace PTEmu
{

    public class DatabaseProtocol : IDatabaseProtocol
    {
      (constructors and methods)
    }
 }

此代碼用於加載 DLL 並創建 class 的實例

var assembly = Assembly.LoadFrom("database\\" + file);
var t = assembly.GetType("PTEmu.DatabaseProtocol");
var protocol = Activator.CreateInstance(t) as IDatabaseProtocol;

Assembly.LoadFrom, assembly.GetTypeActivator.CreateInstance本身不會引發任何錯誤。

我看不出有什么問題,因為我從另一個可以正常工作的項目中獲取這段代碼。

如果我刪除as IDatabaseProtocol IDatabaseProtocol ,它返回一個 object,但不是我想要的接口那樣的 object,所以我可以輕松調用這些方法...

這是類型標識的問題。 在.NET中使用類型的身份只是命名空間名稱和類型名稱。 它還包括它來自的程序集。 所以這里的錯誤是您有兩種不同的接口類型。 一個來自您的主程序集,另一個來自插件程序集。 用“添加鏈接”添加源代碼文件還不夠好,這關系到將類型編譯到哪個程序集中。 換句話說,源代碼文件在類型標識中根本不起作用。

可能值得注意的是,該規則已在.NET 4中更改。類型的標識可以僅由應用於該類型的[Guid]屬性的值確定。 這將在程序集引用的屬性中啟用“嵌入互操作類型”功能。 也稱為No PIA功能。 但是,它僅在COM接口類型上有效。 當您編寫使Office應用程序自動化的代碼時,它不必安裝大量的PIA。

但是,您必須做與PIA完全相同的工作,PIA是定義接口類型並被兩個項目都引用的第三個程序集。

我通過添加一個存儲framework名為framework的新項目解決了我的問題。 然后在其他兩個項目中引用了它。

不要打擾,不要浪費你的時間!

  1. 為接口創建一個新的 DIFFERENT class 庫
  2. 在這個新庫中創建一個界面
  3. 在您的 class(其他項目)中實現接口
  4. 嘗試重新運行
  5. TAADAAAM!

.net 需要此接口在其他 class 庫中而不是同一個庫中!!

我有幾乎類似的問題。 但在我的例子中,接口已經在不同的共享 class 庫中。 解決方案是將共享參考項目的“復制本地”屬性設置為“否”。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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