为什么我在Assembly.Load一个肯定存在的程序集时出现FileNotFoundException?

时间:2011-06-22 12:51:31

标签: c# .net reflection azure

在我的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()加载程序集?

4 个答案:

答案 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();

表现出类似的行为。