1

ネイティブ コードを含む可能性のあるカスタム パッケージで拡張できる Java アプリケーションを使用しているため、拡張 jar を追加する以外に Java 環境を制御することはできません。

この例では、Java 拡張機能から C# コードを呼び出せるようにする必要があります。これは、以前に登録不要の COM を使用して純粋なネイティブ コンテキストから使用された C# コードであり、正常に動作します。今度は、この Java コンテキストから同じコードを使用できるようにする必要がありますが、DLL を見つける場所を制御する方法がないように思われるという問題が発生しました。DLL を JRE/JDK の bin ディレクトリにインストールすることを要求することは明らかにオプションではなく、DLL を GAC に登録することを要求することは理想的ではありません。

現時点では、すべての DLL 依存関係が拡張機能の jar にパッケージ化され、実行時に必要なときに読み込まれることを願っています (手動のインストール手順は必要ありません)。

アクティベーション コンテキスト API を使用してこれを機能させたいと考えており、 D : \somepath\の DLL を使用して、このコードのさまざまなバリエーションをテストしました。

ACTCTX actctx = {sizeof(actctx)};
actctx.lpSource = "D:\\somepath\\dll.manifest";
actctx.lpAssemblyDirectory = "D:\\somepath\\";
actctx.dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID;

HANDLE hActCtx = CreateActCtx(&actctx);
ULONG_PTR ulpCookie = 0;
ActivateActCtx(hActCtx, &ulpCookie);

CoCreateInstance(...);

マニフェストには、 CoCreateInstanceの呼び出しによって参照される C# クラスを含むアセンブリの詳細を含む、1 つのdependentAssembly が含まれています。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity name="[assemblyname]" processorArchitecture="msil" publicKeyToken="[token]" version="[version]" />
    </dependentAssembly>
  </dependency>
</assembly>

mt.exe を使用して DLL からダンプされたこの形式のマニフェストでも試してみました。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity name="[assemblyname]" version="[version]" publicKeyToken="[token]" processorArchitecture="msil"/>
    <clrClass clsid="..." progid="..." threadingModel="Both" name="..." runtimeVersion="v4.0.30319"/>
    ...
    <file name="[assemblyname].dll" hashalg="SHA1"/>
</assembly>

CreateActCtxActivateActCtxの呼び出しは成功しますが、DLL をC:\Program Files\Java...に配置しない限り、 CoCreateInstance呼び出しは常に失敗し、0x80070002 が返されます。

完全に管理されていない C++ DLL を読み込み、任意の既知の場所にある DLL から C# クラスのインスタンスを作成できる (GAC を使用する以外の) 解決策はありますか?

4

0 に答える 0