Сборка не загружается, нет ошибки журнала fusion

У меня есть очень минимальное консольное приложение, которое просто пытается распечатать значение перечисления из сборки, на которую ссылаются. Давайте назовем сборку «VendorAssembly.DDK.dll» и скажем, что она определяет «Vendor.Namespace». Вот мой анонимный тестовый код. IntervalType — это просто перечисление.

using Vendor.Namespace;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            IntervalType h = IntervalType.Hours;

            Console.WriteLine($"{h}");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }
}

Он компилируется нормально.

Но когда я пытаюсь запустить его, немедленно возникает исключение (до фактического ввода метода Main()), которое говорит: System.IO.FileNotFoundException was unhandled Message: An unhandled exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll Additional information: Could not load file or assembly 'VendorAssembly.DDK.dll' or one of its dependencies. The specified module could not be found.

Несмотря на то, что я пытался запустить это приложение несколько раз, fuslogvw.exe не выводит для него никаких ошибок связывания. Если для fuslogvw.exe установлено значение «Записывать все привязки к диску» с включенным настраиваемым путем журнала, поиск в пользовательской папке журнала fusion показывает одно событие привязки, которое, по-видимому, было успешным?

*** Assembly Binder Log Entry  (19/01/2018 @ 6:09:45 PM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\SVN\redacted\ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = VendorAssembly.DDK, Version=6.77.6580.1, Culture=neutral, PublicKeyToken=9e16b9dd55e2cd53
 (Fully-specified)
LOG: Appbase = file:///C:/SVN/redacted/ConsoleApplication1/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = ConsoleApplication1.vshost.exe
Calling assembly : ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\SVN\redacted\ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Publisher policy file is found at C:\WINDOWS\Microsoft.Net\assembly\GAC_64\policy.6.77.VendorAssembly.DDK\v4.0_6.77.6580.1__9e16b9dd55e2cd53\policy.6.77.VendorAssembly.DDK.config.
LOG: Publisher policy file redirect is found: 6.77.6580.1 redirected to 6.77.6580.1.
LOG: ProcessorArchitecture is locked to AMD64.
LOG: Post-policy reference: VendorAssembly.DDK, Version=6.77.6580.1, Culture=neutral, PublicKeyToken=9e16b9dd55e2cd53, processorArchitecture=AMD64
LOG: Found assembly by looking in the GAC.
LOG: Binding succeeds. Returns assembly from C:\WINDOWS\Microsoft.Net\assembly\GAC_64\VendorAssembly.DDK\v4.0_6.77.6580.1__9e16b9dd55e2cd53\VendorAssembly.DDK.dll.
LOG: Assembly is loaded in default load context.

VendorAssembly.DDK.DLL — это управляемая оболочка, которая вызывает неуправляемый код C++. При просмотре VendorAssembly.DDK.dll в обозревателе сборок Visual Studio говорится, что он ссылается на mscorlib, System, System.Configuration.Install, System.Data, System.Xml и Kernel32.dll. Я также добавил все перечисленные сборки .NET в качестве ссылок на консольное приложение.

Мое консольное приложение предназначено для платформы x64 и .NET 4.5.1, что точно соответствует метаданным в VendorAssembly.DDK.dll.

Что мне нужно сделать, чтобы эта сборка загружалась правильно?

Почему fuslogvw не показывает, что происходит не так?


person Hydrargyrum    schedule 19.01.2018    source источник
comment
ProcessorArchitecture привязан к AMD64. С вашим приложением все в порядке? Кроме того, я бы проверил, совпадает ли PublicKeyToken=9e16b9dd55e2cd53 в csproj b packages.config, на всякий случай.   -  person Vladimir Arustamian    schedule 19.01.2018
comment
Я думаю, должно быть нормально, что архитектура процессора привязана к AMD64... по этой причине мое приложение нацелено конкретно на x64, а не на AnyCPU. Мне нужна только версия x64, версия x86 не требуется. Я проверю токен открытого ключа.   -  person Hydrargyrum    schedule 19.01.2018
comment
О, вы упомянули packages.config. Эти сборки были установлены на машине как часть MSI, они недоступны через NuGet.   -  person Hydrargyrum    schedule 19.01.2018


Ответы (1)


Ошибка загрузки сборки была вызвана неуправляемыми (C++ DLL) зависимостями VendorAssembly.DDK.dll, которые не были видны в обозревателе сборок Visual Studio, не упоминаются в журналах Fusion, отображаемых программой fuslogvw.exe, и не подробно описаны в трассировка стека исключений отражения .NET.

Я использовал Dependency Walker для выявления и анализа неуправляемых зависимостей.

Другой полезный инструмент для определения того, чего не хватает в неуправляемых зависимостях, — Sysinternals Process Monitor (Procmon), который может отображать имена отсутствующих неуправляемых зависимостей во время выполнения, когда процесс не загружается.

person Hydrargyrum    schedule 22.01.2018