3

COM DLLを使用する.NETアプリケーションがあり、32ビットバージョンと64ビットバージョンの両方があります。32ビットまたは64ビットのいずれかでCOM相互運用機能をサイドバイサイドで機能させる2つのアプリケーションマニフェストを作成しました。ここに32ビットバージョンがあります:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity name="MyApp" version="1.0.0.0" type="win32" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity 
           type="win32" 
           name="MyCOMDll_32.dll" 
           version="1.2.3.4" 
           processorArchitecture="x86" 
           publicKeyToken="0000000000000000"
           language="*" />
    </dependentAssembly>
  </dependency>
</assembly>

ただし、2つのマニフェストを維持すると、移植性が失われます。アプリケーションをインストールするときに、使用するバージョンを決定する必要があります。また、64ビットアプリケーションは32ビットモードで実行できなくなりました。

.NETアプリケーションが実行されるビット数に応じて正しい32ビットまたは64ビットのDLLをロードする可能性はありますか?2つの依存関係要素を使用しようとしました。1つはwith <assemblyIdentity processorArchitecture="x86" .../>、もう1つはwith<assemblyIdentity processorArchitecture="amd64" .../>ですが、アプリケーション構成エラーが発生します。

答えていただければ幸いです。よろしく、モリッツ

4

1 に答える 1

1

アプリケーション マニフェストでこれを行う方法が見つかりませんでした。そのため、アクティベーション コンテキスト API を使用したプログラムによるソリューションを優先して、アプリケーション マニフェストを削除しました。このソリューションは、http://support.microsoft.com/kb/830033/en-us (フィールド Cookie は uint ではなく IntPtr である必要があります) から採用されています。私は、EnsureActivationContextCreated() メソッドの内部を次のように置き換えました。


if (!contextCreationSucceeded)
{
    string manifestLoc = Environment.Is64BitProcess
    ? "MyCOMDll_64.dll.manifest"
    : "MyCOMDll_32.dll.manifest";

    myComActivationContext = new NativeMethods.ACTCTX();
    myComActivationContext.cbSize = Marshal.SizeOf(typeof(NativeMethods.ACTCTX));
    myComActivationContext.lpSource = manifestLoc;

    // Note this will fail gracefully if file specified
    // by manifestLoc doesn't exist.
    hActCtx = NativeMethods.CreateActCtx(ref myComActivationContext);
    contextCreationSucceeded = hActCtx != Failed;
}
于 2010-07-28T07:18:24.340 に答える