将自定义类作为参数传递给已加载的程序集

时间:2012-06-18 15:56:08

标签: c# .net plugins .net-assembly

我正在用C#写一个剪贴板/图片上传工具,其中一个keycombo会例如制作一个截图,然后将图像发送到插件,然后该插件处理上传和返回URL。

现在,这些插件需要保存设置,这些设置需要在我的应用程序中编辑,所以我想我会使用我前一段时间写过的数据保存类,并传递一个初始化的引用该类的实例到插件。

我的想法是将整个类放入一个include,插件编写者可以在他们的项目中包含它来处理数据,但是尽管插件和主应用程序都使用完全相同的代码,但是我得到一个错误。版本不同,即:

  

{“[A] CedInc.Persistence.XMLPersistenceDictionary.savenode不能   转换为[B] CedInc.Persistence.XMLPersistenceDictionary.savenode。类型   A源自'CloudBoard,Version = 1.0.0.0,Culture = neutral,   位于上下文'Default'的PublicKeyToken = null'   'C:\ git的\ CloudBoard \ CloudBoard \ BIN \调试\ CloudBoard.exe'。 B型   源自'CloudBoard FTP上传插件,版本= 1.0.0.0,   在上下文'LoadFrom'中的Culture = neutral,PublicKeyToken = null'   地点   'C:\ git \ CloudBoard \ CloudBoard \ bin \ Debug \ plugins \ CloudBoard FTP   上传plugin.dll'。“}

我的问题是:是否可以将自定义类的实例传递给插件,而不必将其放入要由插件本身加载的程序集中?如果是的话,怎么样?欢迎任何想法/建议!我有点被困在这里。

2 个答案:

答案 0 :(得分:1)

虽然我建议使用共享程序集版本,但您可以为插件作者提供带有预定义类和方法名称的模板代码文件。然后,您可以使用反射搜索加载的程序集,以找到与预定义签名匹配的类和方法。找到方法后,很容易Invoke

答案 1 :(得分:0)

您希望插件根本不参考任何代码?

在这种情况下,您可以在Framework程序集中找到一些可以传递给插件而不是类的接口。也许IDictionaryIDictionary<string,string>可行。这种方式插件不需要引用任何程序集的程序集,您将能够通过自定义实现。因为插件作者的附带好处是更方便单元测试他们的插件(具体类形成一个随机库,这要困难得多)。