如何在引用公共DLL的程序集之间传递引用类型?

时间:2011-02-01 21:09:21

标签: c# .net assemblies

高级别:我正在尝试构建一个控制台应用程序(例如ConsoleApp.exe),它可以对任何引用ConsoleApp.exe中定义的特定类型的DLL执行某些处理。

我可能错误地决定,我需要一个用于ConsoleApp的伴随DLL,其中包含一些或多种类型(例如ConsoleClass),这些类型旨在被arbirary DLL引用。为了解决这个问题,我不知道更好的方法,我在ConsoleApp解决方案中有两个项目,一个是类库(Proving ConsoleApp.dll),另一个是引用类库项目的控制台应用程序。

此时,我现在能够将ConsoleApp.dll复制到另一个相对不相关的项目(例如OtherApp.dll),引用它,并编写一个使用ConsoleClass实例作为参数的方法。 / p>

现在,为了任意处理这个OtherApp.dll,ConsoleApp.exe加载该程序集,在该程序集中实例化正确的类,然后在该实例上调用正确的方法。下面的相关行有望为我如何做到这一点提供背景:

Assembly.LoadFrom(path_to_OtherApp_dll);
...
var x = (dynamic)Activator.CreateInstance(type_inside_OtherApp_dll);
...
var instance = new ConsoleClass();
x.some_method_call(instance);

最终这失败了。这似乎是因为即使两个项目(ConsoleApp.exe和OtherApp.dll)引用相同的DLL来定义ConsoleClass,运行时仍然认为它们是不同的类型。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

  1. 定义公共接口。把它放到自己的interface.dll。
  2. 插件中的引用interface.dll。让plugin.dll中的主类实现你的界面。
  3. 您的exe中的引用interface.dll。
  4. 使用Assembly.Load()或Assembly.LoadFrom()将插件加载到您的exe中。
  5. 使用CreateInstance()创建插件类的实例。
  6. 只需将创建的插件强制转换为您的界面类型。
  7. 所以你不需要“动态”或其他复杂的东西。只是简单,在我写的时候一步一步走,它会起作用。祝你好运。

答案 1 :(得分:0)

你认为“运行时认为它们属于不同类型”是什么?设置是否以错误的一些例外结束? x变量中的方法是否会收到它无法识别的内容或什么?

答案 2 :(得分:0)

是的,当ConsoleApp.dll加载两次时会发生这种情况。一次通过主应用程序,再次通过插件,使用其本地副本。类型的标识由加载的程序集决定。

我不清楚这是怎么发生的。你选择的第一个武器是Fuslogvw.exe,将其设置为记录所有绑定。首先要做的是对插件项目进行操作,并将ConsoleApp.dll引用的Copy Local属性设置为False,这样就不会意外使用额外的副本。

将插件DLL复制到主应用程序构建文件夹是永远不会有问题的解决方案,您可以使用Assembly.Load()加载它们。或者带有.config文件的子目录,该文件使用<probing>元素允许CLR查找它们。