C# CreateInstance(类型)作为接口返回null

C# CreateInstance(类型)作为接口返回null,c#,reflection,C#,Reflection,我将此作为dll的主类: namespace PTEmu { public class DatabaseProtocol : IDatabaseProtocol { (constructors and methods) } } 我使用这段代码加载DLL并创建类的实例 var assembly = Assembly.LoadFrom("database\\" + file); var t = assembly.GetType("PTEmu.Database

我将此作为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.GetType
Activator.CreateInstance
本身不会引发任何错误

我看不出哪里出了问题,因为我从另一个工作正常的项目中获取了这段代码


如果我将
作为IDatabaseProtocol
删除,它将返回一个对象,但不是像我想要的接口那样的对象,因此我可以轻松地调用这些方法。

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

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

这是一个类型标识问题。NET中类型的标识不仅仅是名称空间名称和类型名称。它还包括它来自的程序集。这里的错误是您有两种不同的接口类型。一个来自主程序集,另一个来自插件程序集。用Add-Link添加源代码文件不够好,它关系到编译类型的程序集。或者换句话说,源代码文件在类型标识中根本不起作用

值得注意的是,这条规则在.NET4中有所改变。类型的标识只能由应用于该类型的[Guid]属性的值确定。这在程序集引用的属性中启用了“嵌入互操作类型”功能。也称为无PIA功能。但是,它仅对COM接口类型有效。它结束了在编写自动化办公应用程序的代码时必须安装大量PIA的局面

但是,您必须执行与PIA完全相同的操作,PIA是定义接口类型并由两个项目引用的第三个程序集。

这是类型标识的问题。NET中类型的标识不仅仅是名称空间名称和类型名称。它还包括它来自的程序集。这里的错误是您有两种不同的接口类型。一个来自主程序集,另一个来自插件程序集。用Add-Link添加源代码文件不够好,它关系到编译类型的程序集。或者换句话说,源代码文件在类型标识中根本不起作用

值得注意的是,这条规则在.NET4中有所改变。类型的标识只能由应用于该类型的[Guid]属性的值确定。这在程序集引用的属性中启用了“嵌入互操作类型”功能。也称为无PIA功能。但是,它仅对COM接口类型有效。它结束了在编写自动化办公应用程序的代码时必须安装大量PIA的局面


但是,您必须执行与PIA完全相同的操作,PIA是定义接口类型并由两个项目引用的第三个程序集。

CreateInstance
null返回的值,还是该值不是
IDatabaseProtocol
?您可以将该行分解为两个语句进行验证吗?
protocol
在我将cast
用作IDatabaseProtocol
时变为null您有两个
IDatabaseProtocol
的声明吗?如果两次声明该接口,可能会得到“错误”的接口…我只在将加载dll的项目中创建了它,在dll项目中创建了:添加现有文件->添加为链接,并与加载程序项目中的接口链接您将同一接口添加到第二个程序集。这实际上创建了第二个接口。两个程序集中相同的接口定义是两个不同的接口。
CreateInstance
null返回的值,还是不是
IDatabaseProtocol
?您可以将该行分解为两个语句进行验证吗?
protocol
在我将cast
用作IDatabaseProtocol
时变为null您有两个
IDatabaseProtocol
的声明吗?如果两次声明该接口,可能会得到“错误”的接口…我只在将加载dll的项目中创建了它,在dll项目中创建了:添加现有文件->添加为链接,并与加载程序项目中的接口链接您将同一接口添加到第二个程序集。这实际上创建了第二个接口。两个程序集中相同的接口定义是两个不同的接口。