私たちのプロジェクトには、顧客がVisualBasicでスクリプト化できる簡単なビジネスルールを持つ能力が必要です。私たちのメインプログラムはC#で書かれていますが
顧客が実行したいスクリプトは次のようになります(私は可能な限り単純なケースを検討しています)
var vbCode = @"
If (Row.Code = 12) Then
Row.MappedCode = 1
End If";
そこで、CodeプロパティとMappedCodeプロパティを使用してC#でRowDataクラスを作成しました
namespace ScriptModel
{
public class RowData
{
public int Code { get; set; }
public int MappedCode { get; set; }
}
}
次のような単純なホストオブジェクトクラスを作成しました
namespace ScriptModel
{
public class HostObjectModel
{
public RowData Row { get; set; }
}
}
Roslyn.Scripting.VisualBasic.ScriptEngineを使用してエンジンを作成し、HostObjectModelのインスタンスを使用してセッションを作成し、engine.Execute(vbCode、session)を実行します。
var hostObj = new HostObjectModel();
hostObj.Row = new RowData();
hostObj.Row.Code = 12;
var engine = new Roslyn.Scripting.VisualBasic.ScriptEngine(
new Assembly[] {hostObj.GetType().Assembly},
new string[] {"ScriptModel"} );
var session = Session.Create(hostObj);
engine.Execute(vbCode , session);
そしてそれは私にそれを教えてくれます
(2,25):エラーBC30451:「行」が宣言されていません。保護レベルが原因でアクセスできない場合があります。
しかし、C#で同様のコードスニペットを作成すると
var csharpCode = @"
if (Row.Code == 12)
{
Row.MappedCode = 1;
};";
CSharp.ScriptEngineを使用すると、すべて正しく機能します
では、何が問題なのか、なぜVisualBasic.ScriptEngineがC#でコンパイルされたクラスのパブリックプロパティを表示できないのか、同じMSIL言語に基づいているのか、それとも間違っているのでしょうか。
更新:Visual Basicをインストールし、VBにScriptModelライブラリを作成しました。また、クラス宣言とvbCodeの両方でRowプロパティをRow()関数に置き換えました。どちらも役に立たなかった。:( C#から実行すると、VisualBasic.ScriptEngineがまったく機能しないようです。