高级别:我正在尝试构建一个控制台应用程序(例如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,运行时仍然认为它们是不同的类型。
有什么想法吗?
答案 0 :(得分:3)
所以你不需要“动态”或其他复杂的东西。只是简单,在我写的时候一步一步走,它会起作用。祝你好运。
答案 1 :(得分:0)
你认为“运行时认为它们属于不同类型”是什么?设置是否以错误的一些例外结束? x变量中的方法是否会收到它无法识别的内容或什么?
答案 2 :(得分:0)
是的,当ConsoleApp.dll加载两次时会发生这种情况。一次通过主应用程序,再次通过插件,使用其本地副本。类型的标识由加载的程序集决定。
我不清楚这是怎么发生的。你选择的第一个武器是Fuslogvw.exe,将其设置为记录所有绑定。首先要做的是对插件项目进行操作,并将ConsoleApp.dll引用的Copy Local属性设置为False,这样就不会意外使用额外的副本。
将插件DLL复制到主应用程序构建文件夹是永远不会有问题的解决方案,您可以使用Assembly.Load()加载它们。或者带有.config文件的子目录,该文件使用<probing>
元素允许CLR查找它们。