我将此作为我的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
本身不会引发任何错误。
我看不出有什么问题,我从另一个可以正常工作的项目中获取了这段代码。
如果我删除as IDatabaseProtocol
,它会返回一个对象,但不会返回类似我想要的界面的对象,所以我可以轻松调用这些方法...
答案 0 :(得分:5)
这是类型标识的问题。 .NET中类型的标识是而不是只是命名空间名称和类型名称。它还包括它来自的组件。所以这里的错误是你有两个不同的接口类型。一个来自你的主程序集,另一个来自插件程序集。使用Add Link添加源代码文件是不够的,重要的是编译类型的汇编。或者换句话说,源代码文件在类型标识中根本不起任何作用。
值得注意的是,此规则在.NET 4中已更改。类型的标识可以完全由应用于该类型的[Guid]属性的值确定。这样就可以在装配参考的属性中启用“嵌入互操作类型”功能。也称为无PIA功能。但它仅对COM接口类型有效。它结束了在编写自动化Office应用程序的代码时必须安装大量PIA。
然而,您必须完全相当于PIA,第三个定义接口类型的程序集,并由两个项目引用。
答案 1 :(得分:1)
我通过添加一个存储接口的名为framework
的新项目解决了我的问题。然后我在另外两个项目中引用了它。