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