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

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

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

Re[4]: DLL動的リンク時のコンストラクタについて


(過去ログ 158 を表示中)

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

■91436 / inTopicNo.1)  DLL動的リンク時のコンストラクタについて
  
□投稿者/ milk (1回)-(2019/06/26(Wed) 14:47:54)

分類:[C#] 

お世話になります。

C#でのDLLの動的リンクについて教えて下さい。
現在、DLLから動的に内部のクラスを呼び出そうとしているのですが、
Activator.CreateInstanceを実行すると、
「System.MissingMethodException: 'このプロジェクトで、引数なしコンストラクターは定義されていません。'」
とエラーメッセージが表示されます。

DLL読み込み部分のソースコードは以下になります。
// DLL動的読み込み
Assembly assembly = Assembly.LoadFrom(@"TEST.dll");
Type typeA = assembly.GetType("TEST.ClassA");
dynamic A = Activator.CreateInstance(typeA); // コンストラクタがあるためOK
Type typeB = assembly.GetType("TEST.ClassB");
dynamic B = Activator.CreateInstance(typeB); // コンストラクタが無い(省略?)ためエラー

コンストラクタの有無が原因だと思いますが、省略されている場合、
CreateInstanceは使用できないのでしょうか。
また、コンストラクタがない場合の解決方法がありましたら教えていただけないでしょうか。

・開発環境
Visual Stadio 2017 / .NetFramework4.8

引用返信 編集キー/
■91437 / inTopicNo.2)  Re[1]: DLL動的リンク時のコンストラクタについて
□投稿者/ Hongliang (829回)-(2019/06/26(Wed) 15:14:49)
コンストラクタが存在しないということは(staticクラスでない限りは)ありません。publicとして公開されていないということはあります。
Activator.CreateInstance(Type)は、引数なしのコンストラクタをpublicで公開している場合のみ使用可能です。
引数有りのコンストラクタのみを公開している場合、Activator.CreateInstance(Type, Object[])などが使えます。

まあつまるところそのTEST.ClassBの定義次第です。
普通にClassBをnewするときにどうするかをまず考えてください。
引用返信 編集キー/
■91438 / inTopicNo.3)  Re[2]: DLL動的リンク時のコンストラクタについて
□投稿者/ milk (2回)-(2019/06/26(Wed) 18:56:55)
No91437 (Hongliang さん) に返信
> コンストラクタが存在しないということは(staticクラスでない限りは)ありません。publicとして公開されていないということはあります。
> Activator.CreateInstance(Type)は、引数なしのコンストラクタをpublicで公開している場合のみ使用可能です。
> 引数有りのコンストラクタのみを公開している場合、Activator.CreateInstance(Type, Object[])などが使えます。
>
> まあつまるところそのTEST.ClassBの定義次第です。
> 普通にClassBをnewするときにどうするかをまず考えてください。


ありがとうございます。

TEST.ClassBの定義を確認しましたが、コンストラクタはないので公開されていないようです。
試しに直接newしてみましたが、エディタ上で怒られました。
コンストラクタが見えないためnewできないようです。

ClassB b = new ClassB(); // コンストラクタがないためエラーとなる

ClassBの使用方法としては、メソッドの引数に参照渡しで値をもらってくるクラスになります。

ClassB b = null;
Method1(ref b);

さらに質問になってしまいますが、
ClassBのようなクラスをDLLから動的に扱う方法があれば教えていただけないでしょうか。
呼び出し側はClassBの型はわからない状態です。
引用返信 編集キー/
■91439 / inTopicNo.4)  Re[3]: DLL動的リンク時のコンストラクタについて
□投稿者/ Hongliang (830回)-(2019/06/26(Wed) 19:46:26)
> ClassBの使用方法としては、メソッドの引数に参照渡しで値をもらってくるクラスになります。
> 
> 	ClassB b = null;
> 	Method1(ref b);
> 
> さらに質問になってしまいますが、
> ClassBのようなクラスをDLLから動的に扱う方法があれば教えていただけないでしょうか。
> 呼び出し側はClassBの型はわからない状態です。

outじゃなくてrefなんですか…nullを渡せばいいのであれば別にいいですけど。
一般的には次のような感じになるんじゃないでしょうか。out/refだとdynamicはたぶん無力ですね。

// dll
class A {
    public void GetB(ref B b) {
        b = new B();
    }
}
class B {
    internal B() { }
}

// 呼び出し側
object a = Activator.CreateInstance(typeA);
MethodInfo method = typeA.GetMethod("GetB"); // オーバーロードがあると面倒
object[] param = new object[] { null };
method.Invoke(a, param);
object b = param[0];

引用返信 編集キー/
■91441 / inTopicNo.5)  Re[4]: DLL動的リンク時のコンストラクタについて
□投稿者/ milk (3回)-(2019/06/27(Thu) 13:07:58)
No91439 (Hongliang さん) に返信

教えていただいたコードで、やりたいことが実現できました。
使用するメソッドを取得してobject型で引数に指定するんですね。
ずっと引数に渡すクラスの型を作ろうと考えていました。
これで解決です。ありがとうございました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -