Почему FileNotFoundException, когда я Assembly.Load сборка, которая обязательно присутствует? - PullRequest
5 голосов
/ 22 июня 2011

В моем коде роли 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 ]

4 голосов
/ 22 июня 2011

Этот вызов Load () может быть успешным только в том случае, если файл Microsoft.WindowsAzure.ServiceRuntime.dll хранится в пути проверки вашего приложения. По умолчанию тот же каталог, что и ваш EXE. Проблема в том, что он не хранится там, он хранится в GAC.

Задача GAC - выступать в качестве хранилища сборок с одинаковым именем, но с другой [AssemblyVersion], культурой или архитектурой процессора. В чем проблема с вашей Load (), вы не указываете. Нет никакого разумного способа, которым fusion может выбрать сборку для вас, он может дать вам неправильный. Так что это не беспокоит, даже если есть только один выбор.

Необходимо указать полное имя AsssemblyName.FullName. Используйте Project + Add Reference, чтобы избежать.

3 голосов
/ 22 июня 2011

Из документации 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 голосов
/ 22 июня 2011

Вы должны загрузить его с полным именем, полным сборки.

2 голосов
/ 22 июня 2011

В документации для 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();

Показывает подобное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...