我们有一个.net插件,用于不从插件文件夹加载依赖库的应用程序。场景:应用程序(program files
中的Revit.exe
(->从c:programdatarevitplugindirourplugindir<plugin.dll+dependencies>
加载插件
在大多数机器上,负载工作良好。对于问题的上下文,dll依赖关系如下
Revit.exe
加载plugin.dll
(revit.exe
在programfiles
中,插件在programdata
下的单独预定义目录中(plugin.dll
加载IdentityModel.dll
(在ourplugindir
目录中(IdentityModel.dll
加载System.Text.Encodings.Web.DLL
(在ourplugindir
中(
成功的探测如下所示:IdentityModel
需要System.Text.Encodings.Web.DLL
启动探测
- 检查GAC(失败(
- 检查Revit.exe所在的根文件夹(失败(
- 检查Revit.ext所在的私有子文件夹(失败(
- 检查
ourplugindir
(成功(
在插件加载失败的机器上,由于某种原因,它不会探测ourplugindir
,因此无法找到System.Text.Encodings.Web.DLL
。
插件dll是使用.net 4.7构建的。依赖关系是一种间接依赖关系。
来自MSDN:https://learn.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies
程序集位置也可以使用当前绑定来确定上下文这种情况最常发生在大会上。LoadFrom方法为在COM互操作场景中使用和。如果程序集使用LoadFrom方法引用另一个程序集,调用程序集的位置被认为是关于在哪里可以找到引用的装配
由于插件是由Revit.exe动态加载的,我只能假设应用程序使用Assembly.LoadFrom
或类似的东西来加载插件。
所以问题是,为什么运行时在某些机器上正确地探测并找到插件文件夹中的依赖dll,而在其他机器上却没有探测到相同的文件夹?
您尝试过使用汇编解析器吗?