質問: dotnetコアライブラリ、フレームワーク4.7.2ライブラリ、vb6アプリケーションがあります。 それらすべてにアクセスするための共通ライブラリを作成したいので、.netstandard2.0を選択します .netstandard2.0ライブラリとvb6の間の4.7.2フレームワークラッパーライブラリを試しました。 しかし、私はアセンブリバインディングの問題に遭遇しました 私が見るドキュメントを見て > .NET Coreでは、.NETオブジェクトをCOMに公開するプロセスが、.NET Frameworkと比較して大幅に合理化されました。 > > ただし、.netstandard2.0は言及されていません プロジェクトが.netstandard2.0を使用している場合でも、とにかくドキュメントに従ってみることにしました COMホストの生成の手順を実行しました。この場合、出力ファイルProjectName.dll、ProjectName.deps.json、ProjectName.runtimeconfig.jsonおよびProjectName.comhost.dllがビルドされます。 ただし、ProjectName.comhost.dllおよびProjectName.runtimeconfig.jsonは作成されません。 このドットネット標準の問題で 、Microsoftが「プレビュー4」でツールのサポートを計画していることがわかります。 VS 16.4.5を実行しています [更新] .netコアラッパーライブラリを作成し、comで有効にすることを試みることにしました。 nugetパッケージを介してラッパーライブラリに.netstandardを追加することができました(私はazure devopsを使用して.netstandardライブラリをビルドします) ラッパーライブラリをビルドすると、.dll、.deps.json、.pdb、.runtimeconfig.dev.json、.runtimeconfig.jsonファイルがbin \ Debug \ netcoreapp3.1フォルダーに作成されます。 ただし、.netstandardライブラリファイルはbin \ debugフォルダに表示されません。 .netstandardライブラリと.netcoreラッパーライブラリを同じフォルダにコピーして実行しました ``` regsvr32 MyCoreComWrapper.comhost.dll ``` ただし、VB6から使用できるようにする必要がある.tlbファイルは作成されません。 私はドキュメントで以下に注意します > .NET Frameworkとは異なり、.NET Coreでは、.NET CoreアセンブリからCOMタイプライブラリ(TLB)を生成することはできません。ガイダンスは、COMインターフェイスのネイティブ宣言用のIDLファイルまたはC / C ++ヘッダーを手動で書き込むことです。 > > 私はgithubでいくつかの情報を見つけましたが、.tlbを作成するための段階的なガイドが大好きです 代わりに遅延バインディングを使用することを考えましたが、それをcomライブラリーで使用する方法がわかりません。 [更新] いくつかのVB6ファイルを含むサンプルプロジェクトをGitHubに置きました。 VB6は、フレームワークライブラリで参照される.tlbを参照します。 実行しようとすると、 ``` Could not load file or assembly 'Microsoft.EntityFrameworkCore, Version=3.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' or one of its dependencies. The system cannot find the file specified. ``` それで、フレームワークテストプロジェクトからすべてのファイルをvb6フォルダーにコピーし、再構築して実行しました。 次に、エラーが発生しました ``` Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' or one of its dependencies. The system cannot find the file specified. ``` Microsoft.Extensions.DependencyInjection.dllファイルがファイルバージョン3.100.220.6706で存在することがわかります
回答: この問題は、VB6(IDEまたはコンパイルされた.exeファイル)から実行したときに失敗するアセンブリバインディングの解決が原因です。 これを解決する手順は次のとおりです。 * VBプロジェクトをコンパイルします。たとえば、コンパイルされたファイルが`Project1.exe`ます。 * コンパイルされたVB6ファイルを除いて、すべての.NETアセンブリ(x86およびx64ディレクトリ、およびローカライズ版が重要な場合は言語ディレクトリ)をコピーします。 * `Project1.exe`を実行すると、次のようなエラーが表示されます。 !ここに画像の説明を入力してください エラーは明らかに、 `Project1.exe`ファイル以外のアセンブリのバージョンと参照されるアセンブリのバージョン(自分で作成した参照ではなく、これらのアセンブリに埋め込まれた参照...)の間の不一致です。解像度は多くのパラメーターに依存する非常に複雑なプロセスであるため、.NETプログラムを起動してもわかりません(.NET Core、Framework、Standard、nugetsなどでは改善されません)。 不一致エラーかどうかをさらに確認するには、SDKのFuslogvw.exe(Assembly Binding Log Viewer)ツールを使用することもできます。 これで、アセンブリバージョンの不一致の問題であることがわかりました。実行できることは、 `Project1.exe.config`横に`Project1.exe`という名前のファイルを作成し、それにアセンブリバインディングリダイレクトを追加することです。 設定する最も簡単な方法は、可能なすべてのバージョンを、プログラムが含まれているディレクトリにあるバージョンにリダイレクトすることです。そのため、あなたのケースでは(そして今日、これらすべてが進化する可能性があるため...)、次のようになります。 、おそらくあなたが直接または間接的に参照する*すべての*アセンブリについて: ``` ... ... ``` 残念ながら、多くのサテライトアセンブリがあり、すべてのリダイレクトを正しい情報で作成するのは少し面倒なので、特定のディレクトリ内のすべての.NETアセンブリに対してリダイレクトが自動的に構成された`.config`ファイルを作成するツールを作成しました: https ://github.com/smourier/BindingRedirectGenerator 。 VB6 IDEでも動作するようにするには、 `VB6.exe.config`別に`VB6.exe`ファイルで同じ手順を使用する必要があります。