【问题标题】:Accessing third party NameSpaces in C# from plugin从插件访问 C# 中的第三方命名空间
【发布时间】:2011-11-10 23:22:43
【问题描述】:

我要继续别人的 C# 项目,但我不能和他说话。

NameSpace A 的主程序使用 DLLs with NameSpaces B C D...

这个主程序在运行时加载插件 DLL,这些 DLL 必须访问 NameSpaces A B C D...

但问题是 DLL 只能访问 NameSpace A!

插件引用了主 exe。

非常奇怪的是,我从主程序中获得的已经编译好的 exe(最新版本),在项目 NameSpaces ABCD 的插件 DLL 的对象浏览器中确实有引用,但是当我自己编译主程序 exe 时DLL 只能看到 NameSpace A!

我有所有NameSpaces的所有项目的来源。

任何帮助都会受到热烈欢迎,这让我发疯了!

【问题讨论】:

  • 尝试首先构建所有命名空间的所有项目,然后删除其对主项目的引用。构建主项目并引用所有项目命名空间并重新构建它。

标签: c# plugins dll namespaces


【解决方案1】:

...these plugin DLLs must access NameSpaces A B C D

The plugins have a reference to the main exe

也许缺少信息,或者我缺乏睡眠,但这确实看起来像是一个奇怪的“插件模型”。不幸的是,我不知道更多,可能更多,我不知道如何帮助您当前的情况。

也就是说,我会强烈建议考虑重新设计你的插件。要么:

  1. 让它们成为实际项目的一部分,或者;
  2. 将它们转换为更传统的插件模型。

如果您选择 2 号门,this Application Block article 涵盖了我认为的传统插件模型,如果您采用它可能会让您的生活更轻松。

编辑:我刚刚意识到我的回答可能过于简短,并没有解释我所说的“传统插件模型”是什么意思。

插件不应直接引用您的应用程序,也不应需要重新构建或重新部署才能使用它们。通常,您会在一个项目中定义一个接口(有时称为Separated Interface),但要单独实现它。换句话说,插件可以知道包含接口的核心库,但不必知道使用它的主要可执行文件。

因此,实际上,您在核心库中定义了一个接口,该接口定义了应用程序需要插件提供的方法。然后,您针对该接口编写主应用程序。然后在主应用程序的运行时初始化期间,您可以加载包含插件类的程序集并实例化插件,甚至可以在开发期间将其初始化为测试类。有很多关于如何做到这一点的例子,还有一个 few questions on SO 关于这个。

【讨论】:

  • 非常感谢!我能够让一切正常工作,我必须引用与主 exe 相同的 DLL,我只是指向构建的输出目录。很奇怪,它以前没有用。
  • 不确定哪个部分有帮助,但我很高兴你能成功!随意将其标记为答案。
  • +1 为好答案,无论 OP 是否使用它:)
猜你喜欢
  • 2013-01-15
  • 2015-12-01
  • 2015-10-09
  • 2010-11-22
  • 2012-08-06
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
相关资源
最近更新 更多