我把它作为我的dll的主要类:
namespace PTEmu
{
public class DatabaseProtocol : IDatabaseProtocol
{
(constructors and methods)
}
}
Run Code Online (Sandbox Code Playgroud)
我用这个代码加载DLL并创建类的实例
var assembly = Assembly.LoadFrom("database\\" + file);
var t = assembly.GetType("PTEmu.DatabaseProtocol");
var protocol = Activator.CreateInstance(t) as IDatabaseProtocol;
Run Code Online (Sandbox Code Playgroud)
Assembly.LoadFrom, assembly.GetType和Activator.CreateInstance它本身,不会抛出任何错误.
我看不出有什么问题,我从另一个可以正常使用它的项目中获取了这段代码.
如果我删除as IDatabaseProtocol它,它返回一个对象,但不是像我想要的接口那样的对象,所以我可以轻松调用这些方法...
这是类型标识的问题.在.NET中使用类型的身份不只是命名空间名称和类型名称.它还包括它来自的组件.所以这里的错误是你有两种不同的接口类型.一个来自你的主程序集,另一个来自插件程序集.使用Add Link添加源代码文件是不够的,重要的是编译类型的汇编.或者换句话说,源代码文件在类型标识中根本不起作用.
值得注意的是,此规则在.NET 4中已更改.类型的标识可以完全由应用于该类型的[Guid]属性的值确定.这样就可以在装配参考的属性中启用"嵌入互操作类型"功能.也称为无PIA功能.但它仅对COM接口类型有效.它结束了在编写自动化Office应用程序的代码时必须安装大量PIA.
但是,您必须完全相当于PIA,第三个定义接口类型的程序集,并由两个项目引用.