组装时为什么出现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()加载程序集?

组装时为什么出现FileNotFoundException.加载一个确实存在的程序集

只有在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();

表现出类似的行为。