Inventor 2027 における .NET アドインの依存関係管理 ~ UseInventorAssemblyContext の追加

Inventor 2025 以降、Inventor アドイン開発は .NET Framework ベースから .NET ベースへ移行しました。

これにより、最新の .NET ライブラリや NuGet パッケージを利用しやすくなった一方で、複数のアドイン間で依存 DLL や依存ライブラリのバージョン競合が発生しやすくなるケースも見られるようになりました。

例えば、

  • 異なるバージョンの NuGet パッケージを利用している
  • 複数のアドインが同じ外部ライブラリを利用している
  • ログライブラリや JSON ライブラリを利用している

といった場合に、意図しない DLL が読み込まれたり、実行時エラーが発生したりする可能性があります。

Inventor 2027 では、このような .NET アドインの依存関係管理に関して改善が行われています。

本記事では、Inventor 2027 に追加された UseInventorAssemblyContext 設定と、依存関係分離の考え方について紹介します。


DLL Hell と依存関係管理の歴史

Windows アプリケーション開発では、以前から DLL の依存関係管理が課題になることがありました。

特に、異なるバージョンの DLL を複数のアプリケーションやプラグインが共有する場合、

  • ある DLL を更新したことで別のアプリケーションが動かなくなる
  • 想定していないバージョンの DLL が読み込まれる
  • 同じ DLL 名でも内部仕様の違いによって実行時エラーが発生する

といった問題が発生することがあります。

こうした問題は、一般的に “DLL Hell” と呼ばれてきました。

Inventor のアドイン開発も、長い間 COM ベースで行われてきました。

COM ベースの Add-in では、Windows レジストリへの登録が必要であり、DLL の配置や COM 登録状態によって動作が変わることもありました。

その後、Inventor では RegFree Addin が導入され、.addin ファイルによるアドイン管理へ移行しました。

これにより、

  • レジストリ登録不要
  • xcopy ベースの配置
  • Addin 単位での構成管理

がしやすくなり、運用性が大きく改善されています。

一方で、.NET ベースアドインへ移行した現在では、依存 DLL や NuGet パッケージ管理が新たな課題になっています。

Inventor 2027 の AssemblyLoadContext 対応は、こうした .NET 時代の依存関係管理改善の一つとして位置付けることができます。


Inventor 2024 以前 (.NET Framework) ではどうだったか

Inventor 2024 以前の .NET Framework ベースのアドイン開発では、AppDomain による分離を前提とした動作になっていました。

そのため、現在の .NET ベースアドイン開発と比較すると、アドイン間の依存 DLL やライブラリ競合が問題として表面化しにくい構造になっていました。

また、当時は現在の .NET ベース開発と比較すると、NuGet パッケージや外部ライブラリを大量に利用する構成は比較的少ない傾向がありました。

一方、Inventor 2025 / 2026 の .NET ベースアドインでは、モダン .NET ライブラリや NuGet パッケージを利用するケースが増えたことで、依存 DLL 管理がより重要になっています。


AssemblyLoadContext とは何か

.NET Core 以降の .NET ランタイムでは、DLL(アセンブリ)の読み込みを管理する仕組みとして AssemblyLoadContext(ALC)が導入されています。

簡単に言うと、AssemblyLoadContext は

「どの DLL を、どこから、どの実行空間に読み込むか」

を管理する仕組みです。

例えば、複数のアドインが同じ DLL 名のライブラリを利用している場合でも、

  • 同じ AssemblyLoadContext に読み込む
  • 別々の AssemblyLoadContext に読み込む

で動作が変わります。

同じ AssemblyLoadContext に読み込まれた場合は DLL が共有されますが、別の AssemblyLoadContext に読み込まれた場合は、同じ DLL 名であっても別物として扱われます。

この仕組みにより、アドインごとに依存ライブラリを分離して読み込むことが可能になります。

一方で、複数のアドインや Inventor 本体との間で DLL を共有したい場合には、どの AssemblyLoadContext を利用するかが重要になります。


Inventor 2025 / 2026 での課題

Inventor 2025 / 2026 の .NET ベースアドイン開発では、基本的に Inventor の AssemblyLoadContext が利用されていました。

そのため、複数のアドインが異なるバージョンの DLL や NuGet パッケージを利用している場合、依存 DLL の競合が発生するケースがありました。

例えば、

  • あるアドインは Newtonsoft.Json 12.x を利用
  • 別のアドインは Newtonsoft.Json 13.x を利用

している場合、先に読み込まれた DLL が利用され、後続アドインが想定外の動作をする可能性があります。

そのため、Inventor 2025 / 2026 の .NET ベースアドインでは、依存 DLL 管理が以前より重要になっています。


Inventor 2027 の改善点

Inventor 2027 では、.addin ファイルにUseInventorAssemblyContext 設定が追加され、アドインのアセンブリ ロード コンテキストを制御できるようになりました。

既定では、Inventor の AssemblyLoadContext が利用されます。

一方、

<UseInventorAssemblyContext>0</UseInventorAssemblyContext>

を指定することで、アドインは独自の AssemblyLoadContext を利用して読み込まれます。

この場合、依存ライブラリはまずアドイン フォルダ内から検索され、見つからない場合に Inventor のインストール フォルダが検索されます。

これにより、異なるバージョンの NuGet パッケージや外部ライブラリを利用する複数アドイン間で、依存 DLL の競合を回避しやすくなっています。

*Inventor 2025 / 2026 でも、独自の AssemblyLoadContext を用いた依存関係分離をすること自体は可能でしたが、アドイン側での追加実装が必要でした。Inventor 2027 では、.addin ファイルの設定として標準的に切り替えられるようになりました。


.addin ファイルでの設定

例えば、以下のように .addin ファイルへ設定を追加できます。

Inventor の AssemblyLoadContext を利用する場合(既定)

<UseInventorAssemblyContext>1</UseInventorAssemblyContext>

または、この設定自体を省略した場合も、既定では Inventor の AssemblyLoadContext が利用されます。


独自の AssemblyLoadContext を利用する場合

<UseInventorAssemblyContext>0</UseInventorAssemblyContext>

この場合、アドインは独自の AssemblyLoadContext を利用して読み込まれます。


注意点

Inventor の Bin フォルダ配下では適用されない

この設定は、.NET ベースのアドインに対して適用されますが、アドイン バイナリが Inventor の Bin フォルダ配下に配置されている場合には適用されません。

そのため、依存関係分離を利用する場合には、.addinファイルの設定だけでなく、アドイン DLL の配置場所についても注意が必要です。

すべてのケースで必要になるわけではない

UseInventorAssemblyContext=0 は、すべてのアドインで必要になるわけではありません。

例えば、

  • 外部ライブラリをほとんど利用しない
  • 他アドインとの DLL 競合が発生していない

といったケースでは、既定設定のままでも問題なく動作する場合があります。

一方で、

  • 多数の NuGet パッケージを利用する
  • 独自ライブラリを多用する
  • 複数アドインを同時利用する

といったケースでは、依存関係分離を検討する価値があります。


まとめ

Inventor 2027 では、.addin ファイルの UseInventorAssemblyContext 設定により、.NET アドインの依存関係分離を選択できるようになりました。

これにより、

  • DLL バージョン競合の回避
  • 複数アドインの共存性向上
  • NuGet ベース開発の安定化

が期待できます。

Inventor 2027 の依存関係分離機能は、こうした .NET ベース開発における運用性向上の一つとして捉えることができます。


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading