現象
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の利用箇所が少ない場合などの回避としてご利用ください。
記事全体を表示