3

私はC#.net 3.5で作業しており、64ビットプラットフォームで実行しています。

動的にロードする必要がある32ビットのdllがあります。dllは、「C:\ Programfiles \ ApplicationToLoad\Application.dll」の下にあります。

dllは32ビットなので、アプリケーションも32ビットにコンパイルする必要があります。

dllをロードする前に、WinVerifyTrustを使用してdllが署名されているかどうかを確認しますが、エラーが発生します0x80092003 =CRYPT_E_FILE_ERROR=ファイルの読み取りまたは書き込み中にエラーが発生しました。

私は32ビットにコンパイルされており、Program Filesx86ではなくProgramFilesの下にあるdllをチェックしようとしているため、これが発生すると推測しました。そこで、system32 / driversフォルダー内のデジタル署名の確認の回答に従い、FSリダイレクトを無効にしようとしましたが、役に立ちませんでした。

私は問題が何らかの形でリダイレクトに関係していると確信しています。

  1. 「プログラムファイル(x86)」の下にApplicationToLoadフォルダーのコピーを作成しました-WinVerifyTrustはステータスOKを返しました

  2. アプリケーションを64ビットにコンパイルしました-WinVerifyTrustはステータスOKを返しました

アップデート:

これは、リダイレクトを無効にするコードです。

 IntPtr ptr = new IntPtr();
  Wow64DisableWow64FsRedirection(ref ptr);
  var lStatus = WinVerifyTrust(
                    IntPtr.Zero,
                    pGuid,
                    pData);

 Wow64RevertWow64FsRedirection(ptr);

pinvoke宣言:

 [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
4

1 に答える 1

0

私はそれを理解しました-問題はファイルパスに余分なスペースがあったことでした。また、32ビットと64ビットでファイルパスを取得するコードが異なるため、64ビットにコンパイルしたときに再現されませんでした。したがって、リダイレクトとは何の関係もありません...

于 2012-10-10T14:02:40.083 に答える