在我的Windows Azure角色C#代码中,我执行以下操作:
Assembly.Load( "Microsoft.WindowsAzure.ServiceRuntime" );
抛出和FileNotFoundException
。问题是存在这样的名称的程序集,甚至在上面的代码运行之前加载 - 我在调试器“输出”窗口中看到相应的行,当我这样做时:
AppDomain.CurrentDomain.GetAssemblies().Any(
assembly => assembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime"));
结果为true
,如果我使用Where()
,则SingleOrDefault()
我会获得对相应Assembly
对象的引用。
为什么我无法使用Assembly.Load()
加载程序集?
答案 0 :(得分:4)
如果Microsoft.WindowsAzure.ServiceRuntime.dll存储在应用程序的探测路径中,那么Load()调用才能成功。默认情况下与EXE相同的目录。问题是,它没有存储在那里,它存储在GAC中。
GAC的目的是充当具有相同名称但不同[AssemblyVersion],文化或处理器架构的程序集的存储库。您的Load()存在哪个问题,您没有指定任何问题。融合可以为你选择一个装配是没有合理的方法,它很容易给你错误的。所以它不会打扰,即使只有一个可以选择。
指定完整的AsssemblyName.FullName是必需的。使用Project + Add Reference来避免。
答案 1 :(得分:3)
您应该使用完整的程序集限定名称加载它。
答案 2 :(得分:3)
来自MSDN文档:
// You must supply a valid fully qualified assembly name.
Assembly SampleAssembly = Assembly.Load
("SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3");
答案 3 :(得分:2)
Assembly.Load的文档说明您打算为程序集提供完整名称(包括版本信息)。
如果组件正常从例如装载,则仅使用组件的普通名称将失败GAC。 E.g:
try
{
Assembly.Load("System");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine(AppDomain.CurrentDomain.GetAssemblies().Any(
assembly => assembly.FullName.StartsWith("System")));
Console.ReadLine();
表现出类似的行为。