【问题标题】:Make classes and objects of "main-project" known to "plugin-project" in C#在 C# 中使“插件项目”知道“主项目”的类和对象
【发布时间】:2017-12-22 20:52:56
【问题描述】:

我有一个应用程序并希望集成其他人为此应用程序编写插件的可能性。我的第一种方法是这样的:

Creating a simple plugin mechanism

我还需要从我的插件访问主应用程序的类和对象。目前我通过在插件项目中添加整个 MyApplication.exe 作为参考然后引用“使用 MyApplication;”来做到这一点。

有没有更好的方法来实现这个功能?如何在插件项目中使用我的主应用程序中的对象等而不引用整个应用程序?

实际上,我不想在自己的 dll 中将整个类与我的主应用程序分开。我可以构建类似“dummy-dll”的东西,它只使插件项目的对象等在没有整个实现的情况下为人所知吗?主要实现应该保留在主应用程序中,我只需要可以从我的插件项目中的主应用程序中引用对象等的东西。


更新:

我已经尝试了以下选项:

  • 插件项目中应该可用的每个类都更改为部分类。然后我创建了一个新的类库项目并添加了这些部分类的副本,删除了详细的实现并创建了 dll。我将 dll 添加到插件项目中。这些类现在可用,但是当我启动我的主应用程序时,出现了一个“FileNotFoundException”,表示找不到文件或程序集。

  • 为插件项目中应可访问的每个类创建了一个接口。问题是通过接口表示的类之一是抽象的(并且必须保持抽象),并且在这个类中创建了另一个类的新实例,该实例也在新的“接口项目”中引用。但是在 C# 中,不可能向接口添加构造函数。所以如果我想通过插件项目中的接口引用这个抽象类的方法,总是会出错。

有人向我简单解释一下如何在插件项目中访问 mainApplication 的对象/类?

【问题讨论】:

  • 使用接口。
  • 我已经使用了一个接口,就像上面链接中显示的一样。但这样我就无法“看到”插件项目中主应用程序的所有对象。
  • 您可以将类声明为部分类,然后在 dll 中使用相同的命名空间并为类创建部分虚拟对象。
  • 从您要发布到单独程序集中的插件的所有类中提取接口,然后通过插件中的接口注入您的类。

标签: c# dll plugins static-methods static-classes


【解决方案1】:

创建一个单独的项目,它是一个类库(因此它编译为 DLL)。现在,对于您想要访问的主项目中的每个对象/类,创建一个接口并将其添加到该项目中。现在插件只需要引用接口项目(dll)就可以知道你的类的外观了。

【讨论】:

  • 你的意思是对于主项目中的每个类都有一个同名和相同方法的接口吗?
  • 是的。但是,如果您不希望该类可用于插件,则不必为其添加接口
  • 但是带有接口的单独项目应该和主应用程序在同一个解决方案中?
  • 是的,它可以在主解决方案中。它将编译为您的插件可以引用的单独 DLL
  • 其中一个类是静态类。在 C# 中,我无法定义静态接口,因此我无法为该类创建接口... :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2016-09-16
  • 1970-01-01
  • 2014-05-19
  • 2014-07-11
  • 2011-08-25
  • 2014-03-24
相关资源
最近更新 更多