1

我将此作为我的 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,它会返回一个对象,但不是像我想要的接口那样的对象,所以我可以轻松地调用这些方法......

4

2 回答 2

6

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

值得注意的是,该规则在 .NET 4 中已更改。类型的标识可以完全由应用于该类型的 [Guid] 属性的值确定。这在程序集引用的属性中启用了“嵌入互操作类型”功能。也称为无 PIA 功能。然而,它仅对 COM 接口类型有效。当您编写自动化 Office 应用程序的代码时,它不再需要安装大量的 PIA。

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

于 2013-06-12T01:57:22.777 回答
1

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

于 2013-06-12T00:40:55.630 回答