C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#からロードしたCLIのDLLのクラスのキャスト

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■93349 / inTopicNo.1)  C#からロードしたCLIのDLLのクラスのキャスト
  
□投稿者/ MT (1回)-(2019/12/06(Fri) 15:04:01)

分類:[.NET 全般] 

C#からC++/CLIのDLLロードし、ポルモフィズム的にキャストして利用することを考えていますが、
現状キャストエラーとなってしまいます。
何かわかりますようなら教えていただきたく。

〇構成
[C++/CLI]
・BaseDLL
interface class IBase

・Library1DLL
ref class Lib1Class : IBase

・Library2DLL
ref class Lib2Class : IBase

[C#]
・BaseDLLを参照設定で読み込んでおく。
・以下のような感じで、ライブラリーDLLをロードして
IBaseクラスにキャストして利用する。
----------------------------------------------
Assembly assembly = Assembly.LoadFrom("LibraryDLLファイル名");
libType = assembly.GetType("Lib1Class");
Object obj = Activator.CreateInstance(libType);

// GetInstanceの戻り値はインターフェース型を返すように定義。
MethodInfo method = libType.GetMethod("GetInstance");
Object ret = method.Invoke(obj, null);

// ここで、「Lib1Classのオブジェクトを型IBaseにキャストできません」と例外が発生する。
IBase baseClass = (IBase)ret;
-----------------------------------------------


引用返信 編集キー/
■93350 / inTopicNo.2)  Re[1]: C#からロードしたCLIのDLLのクラスのキャスト
□投稿者/ Hongliang (932回)-(2019/12/06(Fri) 15:14:08)
型は、名前空間を含めた型名と、その型を定義するアセンブリを合わせて識別されます。なので、
a.dllに定義されているHoge.Fuga.IBaseインターフェイス
b.exeに定義されているHoge.Fuga.IBaseインターフェイス
は別物になりますし、aのほうのIBaseを実装しているクラスXはbのほうのIBaseにキャストできません。

プラグイン的に扱うのなら、プラグインdllが実装するインターフェイスを公開するbase.dllを作る方向とか。
引用返信 編集キー/
■93351 / inTopicNo.3)  Re[2]: C#からロードしたCLIのDLLのクラスのキャスト
□投稿者/ MT (2回)-(2019/12/06(Fri) 15:26:32)
早速の回答有難うございます。

型はアセンブリと紐づいてしまっているのですね・・・

> プラグイン的に扱うのなら、プラグインdllが実装するインターフェイスを公開するbase.dllを作る方向とか。
この方法で試してみようと思います。

有難うございました。
引用返信 編集キー/
■93353 / inTopicNo.4)  Re[3]: C#からロードしたCLIのDLLのクラスのキャスト
□投稿者/ MT (3回)-(2019/12/06(Fri) 16:19:10)
まさにプラグイン的に使いたかったので、ご指摘の方法で実施したところ、うまく動作しました。
有難うございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ