繁体   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