0

Microsoft プロジェクトの VSTO を使用してアドインを開発しており、管理されていない c++ dll をラップする管理された c++ dll があります。64 ビット用と 32 ビット用の 2 つのバージョンのマネージ C++ DLL を展開する必要があります。Assembly.LoadFrom(path) を使用して、実行している Office のバージョンに応じて適切な dll をロードしています。これはすべて、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)
        {

        }  

パスを 3 回確認しましたが、ファイルは存在し、正しい 32 ビット dll です。これはすべて私の 64 ビット マシンでは正常に動作しますが、32 ビット バージョンでテストしようとすると、xpmode で失敗します。

どんな提案でも大歓迎です。

前もって感謝します。

編集

管理されていない dll が見つからない可能性があるという Phillip の提案に応えて、LoadLibraryW(path) を使用して管理されていない dll をスコープにロードしています。

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

1 に答える 1

1

ラッパー アセンブリ (あなたの例ではパスが指しているものだと思います) が正しく読み込まれている可能性がありますが、それが参照するネイティブ DLL が見つかりませんか? コードでそれをチェックしていません。多くの場合、「アセンブリまたはその依存関係の 1 つが見つかりません」というエラー メッセージが表示されます。

これを調査する良い方法は、SysInternals ツールの procmon を使用てファイル システム アクセスを監視するか (システムが 32 ビット DLL を探している場所がわかります)、またはWindows の Fusion 機能を使用することです。

于 2011-08-05T17:15:05.307 に答える