2017-09-27 4 views
2

は、おそらく私は、ツリーのために森を見ていないのですが、ここにある:RoslynベースのスクリプトでSystem.IO.FileSystemを使用するには?

スクリプトでSystem.IO.FileSystemを使用する方法は?

私はMicrosoft.CodeAnalysisを持つ4.6.1フレームワークに基づいたプロジェクトを持っています。 ScriptingパッケージはNuGetと共にインストールされます。その後、私はSystem.IO.FileSystemの中にいくつかの参照が追加されました。プロジェクトソースファイルにというキーワードを使用してという名前を付けることはできません。スクリプトコードで見つかったときも、私はコンパイルエラーが表示されます。

型または名前空間「ファイルシステム」は、名前空間に存在しません「System.IO」

私はここで何をしないのですか?私はSystem.IO.FileSystem.dllがターゲットフォルダにあることがわかります。私は動的にDLLをロードする方法を知っていますが(Assembly.LoadFile)、私はそれが正しい方法であるとは見ません。編集

をここでは、このために使用されるコードのサンプルです:

 string ScriptText = text_Result.Text; 

     try 
     { 
      var Script = CSharpScript.Create<string>(ScriptText, options: ScriptOptions.Default.WithReferences("System.IO.FileSystem")); 
      //Script.Compile(); 
      string Result = Script.RunAsync(null, null).Result.ReturnValue; 
      text_Result.Text += Environment.NewLine + Result + Environment.NewLine; 
     } 
     catch (Exception MyError) 
     { 
      text_Result.Text += Environment.NewLine + MyError.Message + Environment.NewLine; 
     } 

エラーは同じです:

(1,17): error CS0234: The type or namespace name 'FileSystem' does not exist in the namespace 'System.IO' (are you missing an assembly reference?)

答えて

0

あなたはにそのアセンブリへの参照を追加する必要がありますあなたのホストプロジェクトではなく、あなたのRoslynスクリプトセッション。

具体的には、ScriptOptions.Default.WithReferences(...)を使用してください。

+0

に発見された私は、コードを使用して、質問を編集しましたそれはあなたの提案に従って使用されます。それでも同じエラー。 –

+0

おそらく参照を解決できません。 'Compile()'から診断をチェックし、 'Assembly'を渡してみてください。 – SLaks

+0

Compile()の戻り値の後、同じエラーが発生しています。ただし、Compile()はRunAsyncのような実行時エラーを生成しません。 –

0

"System.IO.FileSystem.dll"という名前のdllに "System.IO.FileSystem"という名前の型または名前空間が存在しないようです。

実際には、そのDLLにあったが、今はmscorlibにあり、名前空間System.IO.FileSystemに存在しないか、FileSystemという名前のクラスへの型転送者以外は何もありません。それらはすべて名前空間System.IOにあります。

は、たとえば、あなたは、このようなスクリプトでタイプSystem.IO.FileSystemWatcherを作成することができます。

var code = "return new System.IO.FileSystemWatcher();"; 
var options = ScriptOptions.Default.AddReferences(typeof(FileSystemWatcher).Assembly.Location); 
var script = CSharpScript.Create(code, options); 
var watcher = script.RunAsync().Result.ReturnValue; 

System.IO.FileSystemWatcherが実際にSystem.dllの

+0

FileSystemWatcherはSystem.IO名前空間の一部であり、_using System.IO_を追加した後にアクセスできます。私が正しく理解していれば、System.IO.FileSystemはNet.Coreの一部ですが、プロジェクト参照と適切なdllが追加され、NuGet経由でMicrosoft.CodeAnalysis.Scriptingパッケージが追加されます。私はスクリプト内で、スクリプトと一緒に追加された名前空間やその他の名前空間を使用できるかどうかを理解したい。ホストプロジェクトが4.6.1に基づいているという事実にかかわらず。 –

+0

スクリプトAPIはアプリと同じプロセスでスクリプトを実行するため、アプリが使用しているプラ​​ットフォーム(デスクトップ/コア/ etc)で実行できるライブラリへの参照を使用したいと考えています。 –

+0

したがって、私が正しく理解していれば、適切なバージョン(現在4.6.1)で入手可能なアセンブリのみをスクリプトに含める必要があります。一方、Roslynが動作するには、_Microsoft.CodeAnalysis.Scripting_ inclusionの後に追加された参照が必要です。 –

関連する問題