我们有一个应用程序A,它引用了包含一些静态方法的程序集B.程序集B与app A在同一个Visual Studio解决方案中。
我们希望我们的应用A的用户能够编写插件。他们通过在Visual Studio中创建一个新的类库解决方案,为应用程序A获取Nuget包,并在其插件解决方案中添加一个引用到程序集B来构建插件(目前),以便插件代码进行编译。
他们不需要测试他们的插件,这就是为什么代码只需要编译,尽管如果他们可以在应用程序A中运行代码时调试他们的代码会很好。
一旦他们的代码编译完成,插件的DLL就被放入一个共享中,并被提供给一个不同的团队(我知道的官僚机构),他们将其与app A的其余部分一起使用。
我希望插件DLL能够使用与所有应用程序A的DLL一起使用的程序集B DLL。
当我运行app A时,Activator类会选择插件DLL并正确创建一个实例,但只要调用程序集B中的一个静态方法,插件就会抛出一个MissingMethodException。
我尝试过的事情: 如果你创建它并在应用程序A的Visual Studio解决方案中编译它,插件解决方案肯定可以正常工作。
App A使用框架.Net 4.5,程序集B使用框架.Net 4.0,我尝试用这两个框架构建插件但没有成功。
"特定版本"在所有测试的案例中,插件解决方案中对程序集B的引用都是错误的。
我欢迎这个问题的即时解决方案,但也有关于如何使这些插件工作的更广泛的架构建议。如果有一个重复的问题,我道歉,我找不到。
答案 0 :(得分:2)
对于初学者,您可以使用“Dotpeek”反编译dll,看看方法定义是否完全匹配。 这是一个可用于反编译dotnet库的免费软件。 如果您无法访问.pdb文件,那么我建议使用“dotnet reflector”或“IL Spy”,它将在没有pdb文件的情况下进行反编译。
另外请确保在visual studio中引用项目而不是输出dll。
答案 1 :(得分:0)
我设法解决了我的问题如下:
虽然插件只在程序集B中直接使用静态方法,但这些静态方法实际上对各种OTHER程序集进行了一系列调用。
我没有在插件中添加对程序集B的引用,而是执行了Nuget命令:
Install-Package -Id AppA -ProjectName Plugin
这会将最新的AppA下载到packages文件夹中,并添加了对每个AppA dll的引用。
和之前一样,它编译了,但是这次当我将插件dll拖到AppA bin文件夹中时,插件代码运行时没有抛出异常。