[英]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.GetType
和Activator.CreateInstance
本身不會引發任何錯誤。
我看不出有什么問題,因為我從另一個可以正常工作的項目中獲取這段代碼。
如果我刪除as IDatabaseProtocol
IDatabaseProtocol ,它返回一個 object,但不是我想要的接口那樣的 object,所以我可以輕松調用這些方法...
這是類型標識的問題。 在.NET中使用類型的身份不只是命名空間名稱和類型名稱。 它還包括它來自的程序集。 所以這里的錯誤是您有兩種不同的接口類型。 一個來自您的主程序集,另一個來自插件程序集。 用“添加鏈接”添加源代碼文件還不夠好,這關系到將類型編譯到哪個程序集中。 換句話說,源代碼文件在類型標識中根本不起作用。
可能值得注意的是,該規則已在.NET 4中更改。類型的標識可以僅由應用於該類型的[Guid]屬性的值確定。 這將在程序集引用的屬性中啟用“嵌入互操作類型”功能。 也稱為No PIA功能。 但是,它僅在COM接口類型上有效。 當您編寫使Office應用程序自動化的代碼時,它不必安裝大量的PIA。
但是,您必須做與PIA完全相同的工作,PIA是定義接口類型並被兩個項目都引用的第三個程序集。
我通過添加一個存儲framework
名為framework
的新項目解決了我的問題。 然后在其他兩個項目中引用了它。
不要打擾,不要浪費你的時間!
.net 需要此接口在其他 class 庫中而不是同一個庫中!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.