VBCodeProviderを使用し、文字列で入力したVBのコードを動的に実行可能なことを最近知りましたが、
このコードからプログラム本体のForm上のテキストボックス等にアクセスする方法はありますか?
下記リンク
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
に掲載されたコードを改造してMsgBoxの部分を、プロジェクトに追加したForm1上のTextBoxに表示するように
変更しました(単純に
Form1.TextBox1.Text="xxx"
と変更したのみ)。Form1のTextBox1に表示が出ることを期待しましたが、実行するとCompileAssemblyFromSourceでエラーが戻り、
oCompilerResultsは"名前 'Form1' は宣言されていません。"という内容となります。
文字列のコードに本体プログラムを参照させる記述が必要なんだろうと思いますが、その方法が分かっていません。
以上。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
直接参照させることは出来ないでしょうね。
オブジェクト指向に関する理解が十分に出来ているなら
=======================
Option Explicit On
Option Strict On
Option Compare Binary
'Option Infer Off
Imports System.CodeDom.Compiler
Imports System.Reflection
Imports System.Text
Class DynamicCompileAndRun
Inherits System.Windows.Forms.Form
Private TextBox1 As System.Windows.Forms.TextBox
Sub New()
TextBox1 = New System.Windows.Forms.TextBox
Me.Controls.Add(TextBox1)
End Sub
Shared Sub main()
Dim test1 As DynamicCompileAndRun
test1 = New DynamicCompileAndRun
'文字列リテラルとして書くと結構読みづらいので外部のファイルにすることにした。
Dim SR As System.IO.StreamReader = Nothing
try
SR = New System.IO.StreamReader("./Q4654347D-1.txt",System.Text.Encoding.GetEncoding(65001))
Dim sSource As String = SR.ReadToEnd()
'コンパイルを実行する
Dim oCompilerParameters As New CompilerParameters
oCompilerParameters.GenerateExecutable = False
oCompilerParameters.GenerateInMemory = True
'参照として追加
oCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll")
Dim oVBCompiler As New VBCodeProvider
Dim oCompilerResults As CompilerResults
oCompilerResults = oVBCompiler.CompileAssemblyFromSource(oCompilerParameters, sSource)
'動的コンパイルしたソースにエラーがあった場合、エラーを表示して、終了
If oCompilerResults.Errors.Count >= 1 Then
Debug.Print("動的に与えられたソースコードにコンパイルエラーがありました。")
For Each oCompilerError As System.CodeDom.Compiler.CompilerError In oCompilerResults.Errors
Debug.Print(oCompilerError.ToString())
Next
MsgBox("ソースコードにエラーがあります。イミディエイトウィンドウにエラーを表示しました。")
Exit Sub
End If
'コンパイルしたアセンブリをインスタンス化して実行
Dim oDynamicCompiledAssembly As Assembly = oCompilerResults.CompiledAssembly
Dim oDynamicCompiledClassType As Type = oDynamicCompiledAssembly.GetType("DynamicClass")
Dim oDynamicCompiledMethodInfo As MethodInfo = oDynamicCompiledClassType.GetMethod("DynamicMethod")
Dim oDynamicCompiledInstance As Object = Activator.CreateInstance(oDynamicCompiledClassType)
oDynamicCompiledMethodInfo.Invoke(oDynamicCompiledInstance, New Object(){test1.GetTextBox()})
test1.ShowDialog()
Catch e As System.IO.FileNotFoundException
Debug.Print(e.StackTrace)
Catch e As System.IO.IOException
Debug.Print(e.StackTrace)
Finally
SR.Close()
End Try
End Sub
Public Function GetTextBox() As System.Windows.Forms.TextBox
return TextBox1
End Function
End Class
===============Q4654347D-1.txt==============
Option Explicit
Option Compare Binary
Option Strict On
'Option Infer Off
Public Class DynamicClass
Sub DynamicMethod(TB1 As System.Windows.Forms.TextBox)
TB1.text = "ほげ"
End Sub
End Class
======================
とか引数でSystem.Windows.Forms.TextBoxを渡せるようにして実行します。
#自分の場合、扱い辛いので、独自に呼び出し元と動的コンパイルするソースのインターフェースを決め、それらだけ宣言したDLLを作成し,
呼び出し元プログラムと動的コンパイルするソースの両方で参照するようにして別々に作ります。独自のクラスとして扱え、どちらか一方が完成している必要がなさそうなので。
#この回答を考えるに当たって事前に,(動的コンパイルではなく)コンパイル済みのDLLのものを呼び出し元から呼べるようにすることで、DLL差し替えで動作を変えられる仕組みを作成していました。
この回答への補足
himajin100000様
回答ありがとうございます。
教えていただいたコードで動きました。引数でわたせばよいのですね。
あと、すみませんが以下の部分についてはイメージできませんでした。
引用---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#自分の場合、扱い辛いので、独自に呼び出し元と動的コンパイルするソースのインターフェースを決め、それらだけ宣言したDLLを作成し,
呼び出し元プログラムと動的コンパイルするソースの両方で参照するようにして別々に作ります。独自のクラスとして扱え、どちらか一方が完成している必要がなさそうなので。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
もうすこし詳しく教えていただけないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) Selenium Basicの件 5 2023/04/10 20:55
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
コンパイルエラー
-
AccessVBAでVLookupを使いたい
-
verilogでデマルチプレクサの作...
-
他クラスからForm1内コントロル...
-
Excel VABについて 下記記述が...
-
ラズパイ上の、pythonのエラー...
-
C# IEnumerable が IEnumerable...
-
intel fortranのエラーで困って...
-
43:syntax error at end of input
-
解説サイトに従ったfortran並列...
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
UserForm1.Showでエラーになり...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
配列数式の解除
-
メッセージボックスのOKボタ...
-
【VBA】ワークブックを開く時に...
-
一つのTeratermのマクロで複数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
C# IEnumerable が IEnumerable...
-
対応する関数ヘッダーがありません
-
43:syntax error at end of input
-
構造体のポインタ参照
-
AccessVBAでVLookupを使いたい
-
ラズパイ上の、pythonのエラー...
-
Excel VBA: UserForm.Show で実...
-
Makefile と <math.h>
-
他クラスからForm1内コントロル...
-
【ルネサスのマイコン】E8aから...
-
コンパイルで未定義のシンボル
-
typedef による2重定義
-
フォートラン(fortran)のエラー...
-
fortran 配列宣言のオーバーフ...
-
VBでエラー'ActiveX component ...
-
pythonを使うときのビルド方法
おすすめ情報