Activator.CreateInstance(Type)as Interface返回null

时间:2013-06-11 16:42:23

标签: c# reflection

我将此作为我的dll的主要类:

namespace PTEmu
{

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

此代码用于加载DLL并创建类的实例

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,它会返回一个对象,但不会返回类似我想要的界面的对象,所以我可以轻松调用这些方法...

2 个答案:

答案 0 :(得分:5)

这是类型标识的问题。 .NET中类型的标识是而不是只是命名空间名称和类型名称。它还包括它来自的组件。所以这里的错误是你有两个不同的接口类型。一个来自你的主程序集,另一个来自插件程序集。使用Add Link添加源代码文件是不够的,重要的是编译类型的汇编。或者换句话说,源代码文件在类型标识中根本不起任何作用。

值得注意的是,此规则在.NET 4中已更改。类型的标识可以完全由应用于该类型的[Guid]属性的值确定。这样就可以在装配参考的属性中启用“嵌入互操作类型”功能。也称为无PIA功能。但它仅对COM接口类型有效。它结束了在编写自动化Office应用程序的代码时必须安装大量PIA。

然而,您必须完全相当于PIA,第三个定义接口类型的程序集,并由两个项目引用。

答案 1 :(得分:1)

我通过添加一个存储接口的名为framework的新项目解决了我的问题。然后我在另外两个项目中引用了它。