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

sha*_*oth 5 .net c# reflection azure

在我的Windows Azure角色C#代码中,我执行以下操作:

Assembly.Load( "Microsoft.WindowsAzure.ServiceRuntime" );
Run Code Online (Sandbox Code Playgroud)

FileNotFoundException被抛出.问题是存在这样的名称的程序集,甚至在上面的代码运行之前加载 - 我在调试器"输出"窗口中看到相应的行,当我这样做时:

AppDomain.CurrentDomain.GetAssemblies().Any(
    assembly => assembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime"));
Run Code Online (Sandbox Code Playgroud)

结果是true,如果我使用Where(),那么SingleOrDefault()我得到一个相应的Assembly对象的引用.

为什么我不能加载程序集Assembly.Load()

Han*_*ant 4

仅当 Microsoft.WindowsAzure.ServiceRuntime.dll 存储在应用程序的探测路径中时,该 Load() 调用才能成功。默认情况下与您的 EXE 目录相同。问题是,它不存储在那里,而是存储在 GAC 中。

GAC 的目的是充当具有相同名称但不同 [AssemblyVersion]、文化或处理器架构的程序集的存储库。这是您的 Load() 的问题,您没有指定任何问题。fusion 没有合理的方法可以为您选择一个程序集,它很容易给您错误的程序集。所以即使只有一个可供选择,也没关系。

需要指定完整的 AsssemblyName.FullName。使用项目+添加引用来避免。