Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

Inventor 2025で、.NET FrameworkをターゲットにしてビルドしたC#アプリケーションからiLogicを実行するとタイプ ライブラリが登録されていません エラーとなる

現象

Inventor 2025で、.NET FrameworkをターゲットにしてビルドしたC#アプリケーションからiLogicを実行すると、System.Runtime.InteropServices.COMException HResult=0x80131165 Message=Typelib エクスポート: タイプ ライブラリが登録されていません。 (HRESULT からの例外:0x80131165) Source=mscorlibが発生する。

エラーはiLogicの実行だけではなく、iLogicのAPIを実行すると発生する。

 

なお、同じソースコードでInventor 2024以下のバージョンではエラーは発生せずにiLogicを実行することが出来る。

 

以下のサンプルコードの場合、 auto.RunRule(doc, "Rule1");でエラーとなる。

var type = Type.GetTypeFromProgID(ProgId) ?? throw new Exception($"Failed to get type from '{ProgId}'");
var app = (Inventor.Application)Activator.CreateInstance(type);
app.Visible = true;
var addin = app.ApplicationAddIns.get_ItemById(ILogicAddInClassId);
try
{
    if (!addin.Activated)
    {
        addin.Activate();
    }
}
catch (Exception ex)
{
    throw new Exception("Failed activating iLogic addin", ex);
}
var doc = app.Documents.Open(@"<path to ipt file>");
dynamic auto = addin.Automation;
auto.RunRule(doc, "Rule1");

診断

InventorのiLogic APIはActiveX/COM Automationを用いてAPIを公開しています。Inventor 2025の場合Inventor 本体が従来の.NET Frameworkから.NET(.NET 8)を使用するよう更新がされており、iLogic機能を提供するコンポーネントも.NET 8を使用しております。

 

一方で、.NETでは.NET系の言語からCOM/ActiveX を実行する際の利用されるCOM Callable WrapperにITypeInfoのサポートを削除する変更が加えられています(.NET FrameworkではITypeInfoのサポートされていた)。

 

このため、.NET FrameworkをターゲットにしてビルドしたC#アプリケーションから、iLogicのAPIを遅延バインディング(dynamicキーワドを用いる形で、iLogic APIを呼び出す)を用いて利用すると、.NET で実装されていないITypeInfo情報を取得する処理(GetITypeInfoFromIDispatch 関数)が実行され、エラーが発生します。

解決策

以下のような方法で、エラーの回避が可能です。

 

1.対象のカスタムアプリケーションを.NETを使用するようにマイグレーションを行う

 

2.何らかの事情で、.NET へのマイグレーションが出来ない場合、対象のアプリーションをVB.NETを用いて開発する。VB.NETの場合、上述の問題となっている関数GetITypeInfoFromIDispatchを利用しない形で、遅延バインディングによるAPI実行を行っているため、エラーとなりません。

 

3.Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCallを利用する

2のVB.Netでアプリケーションを開発した場合、VB.NETが内部的に利用している、遅延バインディングでのAPI実行を行う、低レベルのAPIを使用することでC#からもiLogic APIの実行が可能となります。  

NewLateBinding.LateCall(auto, ((object)auto).GetType(), "RunRule1", new object[] { doc, "Rule" }, null, null, null, false);

 

4.dynamic 変数をobject型にCastしたのちにGetType().InvokeMember()を行う

((object)auto).GetType().InvokeMember("RunRule", BindingFlags.Public | BindingFlags.InvokeMethod, null, auto, new object[] { doc, "Rule1" });

 

3及び4の方法は、ソースコードの記述が非常に煩雑でわかりにくくなるため、iLogic APIの利用箇所が少ない場合などの回避としてご利用ください。

 

 

 

コメント

情報ありがとうございます。

以下の記事で参考にさせてもらいました。

https://forums.autodesk.com/t5/inventor-ri-ben-yuforamu/inventor-2024-2025liang-dui-yingnoadoinwo-zu...