私はRoslynスクリプトを使い始めましたが、ScriptOptions
クラスのImports
プロパティがどのように機能するかを理解するのに少し問題があります。名前空間全体をインポートするというコンセプトはうまくいきますが、インポートリストに個々のクラス名を追加すると、スクリプトの中でクラス名を完全修飾することなく使用することはできません。たとえば、次のように別名を使用したRoslynスクリプティング
エラー: "CS0103:名 '日時は' 現在のコンテキスト内に存在しない"
var scriptOptions = ScriptOptions.Default
.WithReferences(typeof(DateTime).Assembly)
.WithImports(typeof(DateTime).FullName);
var script = CSharpScript.Create<DateTime>("DateTime.UtcNow",
scriptOptions);
var now = script.RunAsync(null, CancellationToken.None).Result;
成功:使用完全修飾型名
var scriptOptions = ScriptOptions.Default
.WithReferences(typeof(DateTime).Assembly)
.WithImports(typeof(DateTime).FullName);
var script = CSharpScript.Create<DateTime>("System.DateTime.UtcNow",
scriptOptions);
var now = script.RunAsync(null, CancellationToken.None).Result;
成功:システム名前空間のインポート
var scriptOptions = ScriptOptions.Default
.WithReferences(typeof(DateTime).Assembly)
.WithImports("System");
var script = CSharpScript.Create<DateTime>("DateTime.UtcNow",
scriptOptions);
var now = script.RunAsync(null, CancellationToken.None).Result;
私がしたいのは、スクリプトが名前空間内のいくつかの型にしかアクセスできないようにスクリプトを制限することです。 System
名前空間全体を利用できるようにしたいが、System.DateTime
、System.Math
などへのアクセスを許可するが、これらの型名を完全に修飾する必要はない。私は、using
ステートメントをスクリプト自体に追加することも可能ですが、私は理想的には、スクリプトエンジンにこれを世話してもらいたいと思っています。
WithImports
メソッド(例:ScriptOptions.Default.WithImports("DateTime = System.DateTime")
)でエイリアスを宣言しようとしましたが、コンパイルエラー(CS0246: The type or namespace name 'DateTime = System' could not be found (are you missing a using directive or an assembly reference?)
)が表示されます。
ドキュメントはかなり薄いようですが、source for the ScriptImports
classは、名前空間、静的クラス、および別名をすべてインポートできることを示唆しています。私は何か愚かな何かここに明らかな何かを見逃している? Enfyveの有益なコメントに
UPDATE
おかげで、私は今、静的プロパティとメソッドにアクセスすることができますが、私はまだコンストラクタを呼び出すときに完全修飾名を使用する必要があります。
var scriptOptions = ScriptOptions.Default
.WithReferences(typeof(System.DateTime).FullName)
.WithImports("System.DateTime");
var script = CSharpScript.Create<object>("new DateTime()", scriptOptions);
// Still throws CS0246 compiler error...
var result = script.RunAsync(null, CancellationToken.None).Result.Dump();
あなたの 'WithReferences'と' WithImports'では 'typeof(System.DateTime)...'を代わりに使用します – Enfyve
ありがとうございますが、 'WithImports'は' IEnumerable 'と' params string [] '私は 'Type'を渡すことができません。 https://github.com/dotnet/roslyn/blob/master/src/Scripting/Core/ScriptOptions.cs#L262 –
私は 'typeof(DateTime).Assembly'の代わりに' typeof(System.DateTime) .Assembly' – Enfyve