文字列クラス名よりDLLの関数を呼ぶプログラムを作っています。
問題は関数取得を行っているところです。
呼び出し側で、
Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam)
を行うとNothingが返ってきてしまいます。
原因はDLLのMain1の第2引数がByRefになっていることでした。
そこでByRefに対応するために、
Dim metDll As MethodInfo = typDll.GetMethod("Main1", BindingFlags.Public Or BindingFlags.Instance, Nothing, New Type() {System.Type.GetType("System.String"), System.Type.GetType("System.String&")}, Nothing))
にすると関数の取得ができました。
しかしこの場合、DLL側の関数パラメータ数分、型を定義しなくてはいけないし、オーバーライドしているMain関数すべてに対応できなくなってしまいます。そこで、
Dim typParam() As Type = Type.GetTypeArray(strParam)
の定義時にByRefにあたる部分に"System.String&"型を定義することはできないのでしょうか?
ご回答お願いします。
'****************************
'DLL側(test.dll)
'名前空間(test)
'****************************
Public Class DLL_TEST
Public Overridable Function Main1(ByVal Param1 As String, ByRef Param2 As String) As String
Param2 = "参照返し"
Return Param1
End Function
Public Overridable Function Main1(ByVal Param1 As String, ByVal Param2 As String, ByRef Param3 As String) As String
Param3 = "参照返し"
Return Param1 & ":" & Param2
End Function
'****************************
'呼び出し側
'****************************
Imports System
Imports System.Reflection
Public Class Form1
Inherits System.Windows.Forms.Form
・
・
・
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strParam() As String = {"C", "VB"}
'Dim strParam() As String = {"C", "VB", "J"}
Dim typParam() As Type = Type.GetTypeArray(strParam)
Dim asm As [Assembly] = [Assembly].LoadFrom("上記で作ったDLLの絶対パス")
Dim typDll As Type = asm.GetType("test.DLL_TEST")
Dim objDll As Object = Activator.CreateInstance(typDll)
Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam) 'ここで metDll が Nothing になってしまう
'下記だとmetDll にMethodInfo が返ってくる
'typDll.GetMethod("Main1", BindingFlags.Public Or BindingFlags.Instance, Nothing, New Type() {System.Type.GetType("System.String"), System.Type.GetType("System.String&")}, Nothing)
Dim Ret As String = metDll.Invoke(objDll, strParam)
If Ret = "C" And strParam(1).ToString = "参照返し" Then
MsgBox("成功")
End If
End Sub
No.1ベストアンサー
- 回答日時:
以下のように呼び出し側を変更するとうまくいくようです。
-------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myObj As Object() = New Object() {"C", "VB", "J"}
Dim typParam As Type() = {Type.GetType("System.String"), Type.GetType("System.String"), Type.GetType("System.String&")}
Dim asm As [Assembly] = [Assembly].LoadFrom("ByRef_Test.dll")
Dim typDll As Type = asm.GetType("ByRef_Test.test.DLL_TEST")
Dim objDll As Object = Activator.CreateInstance(typDll)
Dim metDll As MethodInfo = typDll.GetMethod("Main1", typParam)
Dim Ret As String = metDll.Invoke(objDll, myObj)
If myObj(2).ToString = "参照返し" Then
MsgBox("成功")
End If
End Sub
-------------------------------------------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[CakePHP] Paginatorのリンクが変
-
protectedなのにアクセスできな...
-
VB6のコンボボックスのテキスト...
-
PHPの名前空間インポートについて
-
PHP Catchable fatal error の...
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
phpでcookieがうまく保存されない
-
excel access連携 このテーブル...
-
wordの差し込み印刷で文字...
-
「取得先」という表現について
-
VBAでPDFファイルの文書のプロ...
-
バッチファイルで、全てのウィ...
-
shシェルスクリプト 空白行の...
-
【C#】DataGridViewの最大列数...
-
株価を取得して自分のサイトに...
-
VBAでできますか?
-
日付・時刻を比較する方法について
-
EXCEL、マクロ-改ページ行番号...
-
PHPのPHP_SELFに絡む設定を教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
VB.NETからVBAマクロ(引数)を呼...
-
classの再定義エラーについて
-
可変変数にアロー演算子を使いたい
-
ASPのResponse.WriteをPHPでは...
-
PHPの名前空間インポートについて
-
protectedなのにアクセスできな...
-
PHPの変数値をリンクさせたい
-
条件式 ! char[0] とは
-
PHP、ヒアドキュメント内でのIF...
-
fwriteで改行出来ない
-
vb作成したらでbeep音が鳴りま...
-
Smarty変数の値をJavascript変...
-
UNIX CP "で上書きしません"
-
変数に格納できる桁数に制限は...
-
正規表現 ファイル名の取得
-
PHPでの画像の形式の変換
-
PHPで連番を繰り返す
-
Type.GetMethodで困っています
おすすめ情報