问题标签 [assembly-resolution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 疑难解答:通过 Word 代码隐藏调用自定义代码时找不到引用的非托管 dll
语境:
- 我有一个 WPF 应用程序,它使用 D:\WordAutomation\MyApp_Source\Executables\MyApp 文件夹中的某些非托管 DLL。我可以双击 exe 并运行一切。
- 接下来我有一个 Word 2007 代码隐藏项目,它引用上述文件夹中的相关托管 DLL 并尝试做同样的事情.. 调出 App UI。经过充分的'macheting'后,我的用户界面就会显示出来。但是现在有一个用户操作强制加载一个非托管 dll,该 dll 与 FileNotFoundException 一致地爆炸(没有帮助/指示哪个文件丢失)
我在问题行放置了一个断点,清除了输出窗口,按 F10,在我运行该行时比较了输出(将对象添加到 ObservableCollection,其 CollectionChanged 处理程序具有加载非托管片段的代码)
案例1:双击EXE..完美运行(略剪)
案例 2:运行同一行,但从 Word 代码隐藏 .cs 文件中启动
我试过了
- 将非托管 DLL 添加到与(word doc+VSTO dll)相同的文件夹中
- 将文件夹添加到PATH 环境变量。还是一样。
- 任何我能想到的......在过去的几天里
我注意到 Word 似乎正在将托管 ref 程序集复制到如下片段所示的位置。这可能是一个调查线。但是为什么 word 这样做以及它如何解决非托管 DLL .. 我不知道。同样在第一个片段中,有一些从 WinSXS 路径加载的 DLL,这也可能是另一个线索。
终于优雅地关闭了……救命!!
.net - 疑难解答:MS-Word VSTO 加载项中托管 dll 的程序集解析
我有一个 MS-Word VSTO 文档,其中包含一个名为WordDocument1.dll
项目文件夹 D:\Work\Seven\WordAutomation\ContentControls\WordDocument1\bin\Debug
我已将一些自定义代码复制到该MyAppExecs
文件夹下的文件夹中。DLL 具有指定的专用 bin 路径,以便MyAppExecs
可以访问其中的代码。
所以在启动时,我在应该弹出一个对话框Starter.DLL
的MyAppExecs
文件夹中加载一个,它确实如此。但是,单击对话框上的按钮需要加载X.DLL
,它具有非托管依赖项。(X.DLL
有一些托管的 C++,有一些指定为附加依赖项的库。X 是无符号的,是一个私有程序集,不在 GAC 中)
但是,X.DLL 无法解析。从该fuslogvw
工具中,我看到它正在尝试将这个 DLL 加载到 Office12 文件夹中并且失败。我也ProcMon
运行过,但是,它没有显示任何未找到的非托管依赖文件错误。
- 如何让 Word Executable 看到其中存在的 X.Dll
D: \Work\Seven\WordAutomation\ContentControls\WordDocument1\bin\Debug
?
此外,它似乎很奇怪,它可以加载Starter.DLL
和大量其他{ProjFolder}\MyAppExecs
文件而没有任何问题,但看不到{ProjFolder}
.
这是fuslogvw
输出:
更新#1:解决了症状,但无法确定问题的原因。我通过 Assembly.load 手动加载了程序集。但是,上面的程序集解析错误一直被记录下来,但它不起作用。最后,在绝望的情况下,我将我的 word-project DLL 复制到{ProjFolder}\MyAppExecs
这样所有的 DLL 都在一个文件夹中并且它开始工作了。
当我运行时,看起来一些非托管依赖项X.dll
没有得到解决,{ProjFolder}...
但是ProcMon
没有显示任何迹象。还将 PATH 变量更新为 include {ProjFolder}\MyAppExecs
,但没有运气。
因此,将它们全部复制到一个文件夹中是可行的。X.dll
不是我的代码,所以我无法进一步调查。
.net - .net 运行时尝试使用错误版本的程序集
我有一个引用程序集“Microsoft.Xna.Framework,Version=2.0.0.0,Culture=neutral,PublicKeyToken=6d5c3888ef60e27d”的应用程序。我创建了一个安装程序项目,将这个程序集安装在 GAC 中(通过运行 XNA redist 安装程序)。
但是,当第一次使用此程序集时,我在 JITing 期间收到异常。然后我尝试对图像进行 ngen,并且 ngen 给出以下错误消息:
请注意,版本为 1.0.0.0 并且缺少 PublicKeyToken,并且不存在伪造的程序集。什么会导致 JITer 和 ngen 尝试加载这个错误版本的程序集?
程序集的正确版本在 GAC 中。我已经在 Reflector 中打开了我的图像,并且参考在那里正确显示。我还验证了依赖层次结构中没有其他程序集加载伪造的 1.0.0.0 版本。事实上,1.0.0.0 版本在任何地方都不存在,无论是在开发盒上还是在测试机上。
但是,当尝试在测试机器上扩展对Microsoft.Xna.Framework的引用时,Reflector认为(正确地)引用的程序集版本是2.0.0.0,但是即使我可以在GAC中看到它也找不到它在资源管理器中查看 c:\windows\assembly。
请帮忙。
.net - 重定向程序集绑定是否适用于使用测试运行器进行单元测试?
好的,这是我遇到的问题的完整描述:
我正在尝试使用NUnit ExtensionMethods,但是每当我使用 TestDriven.Net 运行包含其中一种扩展方法的测试时,或者如果我只是尝试使用测试运行程序 GUI(Icarus 或 NUnit)加载程序集,我就会得到 FileNotFoundException。
用头撞墙并进一步挖掘,我想我知道出了什么问题。提示反射器,是的,我可以看到 NUnit.Framework>ExtensionMethods.dll 引用了
我当前包含的 nunit 版本是
现在我以前从未使用过程序集重定向,但似乎只需添加一个带有以下行的 App.Config 就很简单了:
我的理解是调用 2.4.6 版本(这台机器上不存在)应该自动重定向到 2.4.8 版本。
但是这不起作用,我怀疑(但尚未确认)这是因为测试运行器不会自动读取 app.config 文件。
所以我的问题如下:
我对问题的诊断是否正确?
程序集重定向是适当的解决方案吗?我做得对吗?
我如何让它与测试运行器一起工作?
c# - 程序集引用无法在我们的构建服务器上正确解析
我们使用 VS2008 SP1 用 C# 编写代码。我们有一台运行 Team System Server 2008 的服务器,我们将其用于源代码控制、任务等。该服务器也是我们用于Team Build的构建机器。这已经工作了很长时间了。直到目前。当我们尝试构建一个引用了一个外部程序集的项目时,我们会收到这些错误消息(这发生在 Team Build 中,以及在物理登录并通过 Visual Studio 进行常规构建时):
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets :警告 MSB3246:已解析文件的图像错误、没有元数据或无法访问。无法加载文件或程序集“C:\Program Files\Syncfusion\Essential Studio\7.1.0.21\Assemblies\3.5\Syncfusion.XlsIO.Base.dll”或其依赖项之一。该模块应包含程序集清单。
C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets(24,2):错误 MSB4062:无法从 Microsoft 程序集加载“Microsoft.Reporting.RdlCompile”任务。 ReportViewer.Common,版本=9.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a。无法加载文件或程序集 'Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。该模块应包含程序集清单。确认声明正确,并且程序集及其所有依赖项都可用。
找不到引用的组件“Syncfusion.XlsIO.Base”。
这些错误是针对一个有一个有问题的程序集引用的项目。当我尝试构建整个解决方案时,当然会因为这个错误而出现更多错误。还有另外两个项目与其他程序集引用有相同的问题。我有一个 VS 似乎无法解析的引用程序集列表:
- Microsoft.ReportViewer.Common
- Microsoft.ReportViewer.WinForms
- Syncfusion.Compression.Base
- Syncfusion.Core
- Syncfusion.XlsIO.Base
Syncfusion 程序集来自第 3 方组件包。其他两个与 Microsoft ReportViewer 组件有关。
引用是通过.NET 选项卡中的“添加引用”窗口添加的,所以我认为这没有任何可疑之处。在程序集引用的属性窗口中,Culture、Description、Path、Runtime Version 或 Strong Name 中没有值。版本说 0.0.0.0 和 Resolved 是 False。我想很明显 VS 无法解析引用。我的问题是为什么???我为这个问题挠了挠头。这仅发生在服务器上,该解决方案在我的机器和我的同事机器上都构建得很好。装配参考属性在我们的机器上很好。
我尝试卸载3rd-party 组件(当然是在服务器上),然后重新安装。没有帮助。我试图修复VS2008安装。没有帮助。试图从源代码控制中检索早期版本(我知道以前在服务器上构建过),但我得到了相同的错误消息。我检查了文件权限,一切似乎都井井有条。我的想法已经不多了...
我该如何解决这个问题?
2009 年 2 月 16 日更新:
我试图比较我的电脑和服务器上的 dll 的 ildasm 输出(请参阅我写的关于此的评论),在我看来是评论的一行中有一个小差异。我必须承认我根本不明白为什么会有区别,所以也许有人可以向我解释一下?我还尝试在服务器上
运行病毒扫描。没有帮助。试图删除引用,然后通过浏览磁盘上的 dll 来读取它。没用。
2009 年 3 月 17 日更新:
我找到了解决方案!罪魁祸首是Panda Antivirus 的 TruPrevent 模块。禁用模块后,一切正常!=)我在fuslogvw.exe及其生成的日志
的帮助下发现了这一点。谷歌搜索结果,偶然发现了这个博客条目。. 希望这可以帮助其他人。
.net - 如何强制从哪里加载程序集?
我开发了一个控制台实用程序,可以对服务器应用程序执行一些操作。由于我正在使用的服务器应用程序的性质,我需要在服务器上执行此实用程序。
问题是该实用程序引用了以前部署到服务器 GAC 的通用 DLL。自通用 DLL 部署以来,它已经更新,我的实用程序依赖于这些更新。由于公司有关部署的政策,我无法更新 GAC 中的 DLL。
默认情况下,我的实用程序将使用 GAC 中过时的 DLL。有没有办法强制它使用更新的 DLL(例如,通过在文件系统上指定路径)?
.net - 在运行时动态加载程序集依赖项的问题
让我试着解释我的问题。我目前正在尝试开发一个用 .Net 编写的小型“插件框架”(主要用于试验)。所以这个想法是有一个主应用程序,可以通过在主应用程序的特定文件夹“插件”中部署 dll 来添加“插件”。一切正常,插件已正确实例化,但是现在我遇到了问题。我现在已经部署了一个插件“X”,它使用了额外的第 3 方插件,所以现在我遇到的问题是在运行时找不到“X”所需的这些额外的第 3 方插件。因此,我现在的想法是添加一个额外的目录“依赖项”,我还部署了所有需要的插件。
所以我的第一个问题:如何将程序集加载到应用程序域中(假设我知道它们的路径)它们可以被我的应用程序使用?
我试图通过做类似的事情来解决这个问题:
问题是这个事件处理程序现在被激活,在 args 变量中有“Presentation.Zune.dll”(我正在使用 WPF 应用程序)。似乎该程序集加载失败,但实际问题是另一个 dll。
有人可以建议我更好的方法来解决我的问题吗?我希望我能够充分解释我的情况,否则只是要求进一步澄清。
谢谢,朱里
c# - 如何在 C# 中从内存中启动程序?
我有一些 UI 应用程序,它位于用 C# 编写的用户任务栏中。该工具的 EXE 已在许多使用它的项目上签入我们的源代码控制系统,因此我们能够通过签入更新的 EXE 来更新它们运行的版本。
问题是当用户获得最新版本的 exe 时,程序经常在运行,并且在他们的机器上同步失败。我想修复它,这样程序在运行时就不会锁定 exe 和任何依赖的 DLL,这样它们就可以同步而不必关闭程序。
目前,我有一个程序将可执行文件作为参数,并通过提前将程序集内容读入内存来从内存中启动它。不幸的是,当涉及到程序所需的 DLL 时,这完全失败了。
我现在拥有的代码如下所示:
我的问题是,我在做一些完全愚蠢的事情吗?有没有更好的方法来处理这个?如果不是,我应该怎么做才能支持处理外部依赖项?
例如,如果您尝试运行使用“Bar.dll”中的函数的“Foo.exe”,上述代码无法加载任何依赖文件,“Foo.exe”将是可覆盖的,但“Bar.dll”仍然是被锁定并且不能被覆盖。
我尝试从加载的程序集上的“GetReferencedAssemblies()”方法获取引用程序集的列表,但这似乎没有给出任何指示应该从哪里加载程序集......我需要自己搜索它们吗?如果是这样,最好的方法是什么?
似乎其他人以前可能遇到过这种情况,我不想重新发明轮子。
- 更新:EXE 已签入,因为这就是我们将内部工具分发给使用它们的团队的方式。它不是这个用例的最佳选择,但我没有机会更改该策略。
.net - 如何强制 csc / mcs 使用特定版本的程序集引用?
我需要引用已签名程序集的特定版本。因为它存在于 GAC 中,所以编译器会选择“供应商”版本而不是我提供的版本(GAC 版本号更高,即使它是较旧的 API)。基本编译器选项是否有某种扩展/reference=Library.dll
允许指定强名称?
我正在使用 NAnt 进行编译,因此<csc>
基于任务的解决方案将是最佳的,但编译器命令行(csc 和 mcs)也可以。
msbuild - 如何解决:自定义 MSBuild 任务需要在 AppBase 之外进行组装
我有一个自定义任务,我想在构建我的 C# 项目时执行。此任务位于 MyTask.dll 中,它引用另一个程序集 MyCommon.DLL。
问题是 MyCommon.dll 相对于 MyTask.dll 位于“..\Common\MyCommon.dll”,这将其置于 MSBuild 进程的 AppBase 目录之外。通过分析 MSBuild 的日志并查看 Fusion 关于绑定失败的报告,我已经确认这确实是问题所在。
如何让 Fusion 在构建过程中找到 MyCommon.dll?请注意,移动程序集会破坏我的应用程序,这也取决于它。
更新:好吧,看来我还是会使用副本。其他解决方案都需要在系统范围内进行修改,这在这里并不真正保证。