VS C# 中的依赖地狱,找不到依赖项
Dependency hell in VS C#, cannot find dependencies
我创建了一个图表 C# 库(我们称之为 chartlibrary
),它本身依赖于多个第三方 dll 文件。
在另一个可执行项目(我们称之为 chartuser
)中,我引用了 chartlibrary
项目(两个项目都位于 Visual Studio 中的同一个解决方案中)。
编译后,我可以看到chartlibrary
引用的所有第三方dll文件也包含在chartuser
的bin/Debug文件夹中。但是,我收到一个运行时错误,它基本上指出 chartlibrary
中的某些引用无法解析这一事实。然后我试图通过
获得更好的想法
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
和
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var assemblyFileName = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
var assemblyPathFileName = _currentPluginPath + @"\" + assemblyFileName;
if (File.Exists(assemblyPathFileName))
{
return Assembly.Load(File.ReadAllBytes(assemblyPathFileName));
}
return null;
}
问题在于 RequestingAssembly
为空,而 Name
非常隐蔽。
我做错了什么,即使所有dll都在可执行项目的bin/Debug文件夹中,也找不到引用dll并且无法解析程序集?
Fix: A fix for the third party library related to their obfuscation engine solved the issue.
.NET Dependencies:也许浏览这个旧答案:How do I determine the dependencies of a .NET application? - 并浏览任何清单文件?
调试: The Microsoft Assembly Binding Log Viewer can show you what's going on at runtime. Launch it via a Developer Command Prompt for Visual Studio
(just search for "developer command", type in "FUSLOGVW.exe"
and press Enter
). Also maybe have a skim: How the Runtime Locates Assemblies.
我不太熟悉它们的用途,但还有一些更进一步的工具(大多数都有超越依赖项的进一步用途):
- ILSpy - 我相信它是开源的。
- AsmSpy - 从未尝试过。
- NDepend - 商业广告。
应用程序启动清单:
- Desktop applicaton not opening after installation in client system
- Windows Application Startup Error Exception code: 0xe0434352
运行时间:如果问题发生在另一台计算机上,则首先在检查列表中的明显运行时间:.Net
、.Net Core
、Java
、Silverlight
、Direct X
、VC++ Runtime
、MS-XML (legacy)
、Crystal Reports
、Microsoft Report Viewer
,SQL Server / Database Runtimes
,等等...加上任何涉及 COM 注册的内容,显然还有您引用的任何第三方框架组件(COM、COM Interop、GAC、程序集等...)。
其他链接:
- Which winform project files should be packed up into the installer
我创建了一个图表 C# 库(我们称之为 chartlibrary
),它本身依赖于多个第三方 dll 文件。
在另一个可执行项目(我们称之为 chartuser
)中,我引用了 chartlibrary
项目(两个项目都位于 Visual Studio 中的同一个解决方案中)。
编译后,我可以看到chartlibrary
引用的所有第三方dll文件也包含在chartuser
的bin/Debug文件夹中。但是,我收到一个运行时错误,它基本上指出 chartlibrary
中的某些引用无法解析这一事实。然后我试图通过
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
和
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var assemblyFileName = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
var assemblyPathFileName = _currentPluginPath + @"\" + assemblyFileName;
if (File.Exists(assemblyPathFileName))
{
return Assembly.Load(File.ReadAllBytes(assemblyPathFileName));
}
return null;
}
问题在于 RequestingAssembly
为空,而 Name
非常隐蔽。
我做错了什么,即使所有dll都在可执行项目的bin/Debug文件夹中,也找不到引用dll并且无法解析程序集?
Fix: A fix for the third party library related to their obfuscation engine solved the issue.
.NET Dependencies:也许浏览这个旧答案:How do I determine the dependencies of a .NET application? - 并浏览任何清单文件?
调试: The Microsoft Assembly Binding Log Viewer can show you what's going on at runtime. Launch it via a Developer Command Prompt for Visual Studio
(just search for "developer command", type in "FUSLOGVW.exe"
and press Enter
). Also maybe have a skim: How the Runtime Locates Assemblies.
我不太熟悉它们的用途,但还有一些更进一步的工具(大多数都有超越依赖项的进一步用途):
- ILSpy - 我相信它是开源的。
- AsmSpy - 从未尝试过。
- NDepend - 商业广告。
应用程序启动清单:
- Desktop applicaton not opening after installation in client system
- Windows Application Startup Error Exception code: 0xe0434352
运行时间:如果问题发生在另一台计算机上,则首先在检查列表中的明显运行时间:.Net
、.Net Core
、Java
、Silverlight
、Direct X
、VC++ Runtime
、MS-XML (legacy)
、Crystal Reports
、Microsoft Report Viewer
,SQL Server / Database Runtimes
,等等...加上任何涉及 COM 注册的内容,显然还有您引用的任何第三方框架组件(COM、COM Interop、GAC、程序集等...)。
其他链接:
- Which winform project files should be packed up into the installer