При загрузке управляемого c ++ dll с использованием Assembly.LoadFrom () получить файл не найдено исключение - PullRequest
0 голосов
/ 05 августа 2011

Я разрабатываю надстройку с использованием VSTO для проекта Microsoft, и у меня есть управляемая dll c ++, которая оборачивает неуправляемую dll c ++.Мне нужно развернуть две версии управляемого c ++ dll - одну для 64-битной и одну для 32-битной.Я использую Assembly.LoadFrom (путь) для загрузки соответствующей DLL в зависимости от того, с какой версии Office я работаю.Кажется, что все это прекрасно работает на моей машине для разработки, которая является 64-битной машиной с 64-битным офисом.Ниже приведен код вопроса:

        try
        {
           //This will return true so I know the file exists
            bool fileExists = File.Exists(path);
            //This will throw a file not found exception
             keyModAssembly = Assembly.LoadFrom(path);

        }
        catch (FileNotFoundException e)
        {

        }  

Я трижды проверил путь, и файл существует и является правильным 32-битным DLL.Все это прекрасно работает на моей 64-битной машине, но в xpmode происходит сбой, когда я пытаюсь протестировать его для 32-битных версий.

Любые предложения будут с благодарностью приняты.

Заранее спасибо.

Редактировать

В ответ на предложение Филиппа о том, что неуправляемая dll может быть не найдена, я загружаю неуправляемую dll в область видимости, используя LoadLibraryW (путь).

// this is not throwing an exception so I know the unmanaged dll is there. 
if (!File.Exists(unmanagedPath))
            throw new FileNotFoundException();
LoadLibraryW(unmangedlibPath);

1 Ответ

1 голос
/ 05 августа 2011

Может ли быть так, что сборка обертки (которая, как я полагаю, указывает на путь в вашем примере) загружена правильно, но нативная DLL, на которую она ссылается, не найдена?Вы не проверяете это в своем коде.Часто в сообщении об ошибке указывается 'Сборка или одна из ее зависимостей не найдена' .

Хороший способ выяснить это - использовать procmon из инструментов SysInternalsдля контроля доступа к файловой системе (которая скажет вам, где система ищет вашу 32-битную DLL) или использования средств Fushion в Windows.

...