组装时为什么出现FileNotFoundException.加载一个确实存在的程序集
本文关键字:一个 程序集 存在 为什么 加载 FileNotFoundException | 更新日期: 2023-09-27 18:00:06
在我的Windows Azure角色C#代码中,我执行以下操作:
Assembly.Load( "Microsoft.WindowsAzure.ServiceRuntime" );
并且抛出CCD_ 1。问题是,具有这样名称的程序集已经存在,甚至在运行上面的代码之前就已经加载了——我在调试器"Output"窗口中看到了相应的行,当我这样做时:
AppDomain.CurrentDomain.GetAssemblies().Any(
assembly => assembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime"));
结果是true
,如果我使用Where()
,那么SingleOrDefault()
我得到对相应Assembly
对象的引用。
为什么我不能用Assembly.Load()
加载程序集?
只有在Microsoft的情况下,Load()调用才能成功。WindowsAzure。ServiceRuntime.dll存储在应用程序的探测路径中。默认情况下,与EXE相同的目录。问题是,它没有存储在那里,而是存储在GAC中。
GAC的目的是充当具有相同名称但不同[AssemblyVersion]、区域性或处理器体系结构的程序集的存储库。这就是Load()的问题所在,您没有指定任何。融合没有合理的方法可以为你选择一个组件,它很容易给你一个错误的组件。所以它并不麻烦,即使只有一个可供选择。
指定完整的AssassemblyName。FullName是必需的。使用Project+添加引用来避免。
您应该使用完整的程序集限定名称加载它。
来自MSDN文档:
// You must supply a valid fully qualified assembly name.
Assembly SampleAssembly = Assembly.Load
("SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3");
Assembly的文档。Load表示您要为程序集提供完整的名称(包括例如版本信息)。
如果程序集通常是从GAC加载的,则仅使用程序集的纯名称将失败。例如:
try
{
Assembly.Load("System");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine(AppDomain.CurrentDomain.GetAssemblies().Any(
assembly => assembly.FullName.StartsWith("System")));
Console.ReadLine();
表现出类似的行为。