質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

Xamarin.Forms_AndroidでMicrosoft.CodeAnalysis.CSharp.Scriptingを利用したいが例外が発生する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 195

Jirobe

score 8

前提・実現したいこと

Xamarin.FormsでAndroidアプリを作成しています。  
Microsoft.CodeAnalysis.CSharp.Scriptingを利用して  
ユーザーが入力したC#のスクリプトを実行するアプリを  
目指しています。  

しかし、スクリプトエンジンを実行してみると例外が起きてしまいます。

どこが悪いか教えていただくことはできませんでしょうか。

発生している問題・エラーメッセージ

System.IO.FileNotFoundException: Could not find file "/mscorlib.dll"
File name: '/mscorlib.dll'
  at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x001b7] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share) [0x00000] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
  at System.IO.File.OpenRead (System.String path) [0x00000] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
  at Roslyn.Utilities.FileUtilities.OpenFileStream (System.String path) [0x0001c] in /_/src/Compilers/Core/Portable/FileSystem/FileUtilities.cs:414 
  at Microsoft.CodeAnalysis.MetadataReference.CreateFromAssemblyInternal (System.Reflection.Assembly assembly, Microsoft.CodeAnalysis.MetadataReferenceProperties properties, Microsoft.CodeAnalysis.DocumentationProvider documentation) [0x0005a] in /_/src/Compilers/Core/Portable/MetadataReference/MetadataReference.cs:327 
  at Microsoft.CodeAnalysis.MetadataReference.CreateFromAssemblyInternal (System.Reflection.Assembly assembly) [0x00000] in /_/src/Compilers/Core/Portable/MetadataReference/MetadataReference.cs:269 
  at Microsoft.CodeAnalysis.Scripting.Script.GetReferencesForCompilation (Microsoft.CodeAnalysis.CommonMessageProvider messageProvider, Microsoft.CodeAnalysis.DiagnosticBag diagnostics, Microsoft.CodeAnalysis.MetadataReference languageRuntimeReferenceOpt) [0x0001a] in /_/src/Scripting/Core/Script.cs:250 
  at Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScriptCompiler.CreateSubmission (Microsoft.CodeAnalysis.Scripting.Script script) [0x00021] in /_/src/Scripting/CSharp/CSharpScriptCompiler.cs:38 
  at Microsoft.CodeAnalysis.Scripting.Script.GetCompilation () [0x00008] in /_/src/Scripting/Core/Script.cs:142 
  at Microsoft.CodeAnalysis.Scripting.Script`1[T].GetExecutor (System.Threading.CancellationToken cancellationToken) [0x00008] in /_/src/Scripting/Core/Script.cs:359 
  at Microsoft.CodeAnalysis.Scripting.Script`1[T].RunAsync (System.Object globals, System.Func`2[T,TResult] catchException, System.Threading.CancellationToken cancellationToken) [0x0001b] in /_/src/Scripting/Core/Script.cs:463 
  at Microsoft.CodeAnalysis.Scripting.Script`1[T].RunAsync (System.Object globals, System.Threading.CancellationToken cancellationToken) [0x00000] in /_/src/Scripting/Core/Script.cs:437 
  at Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.RunAsync[T] (System.String code, Microsoft.CodeAnalysis.Scripting.ScriptOptions options, System.Object globals, System.Type globalsType, System.Threading.CancellationToken cancellationToken) [0x00000] in /_/src/Scripting/CSharp/CSharpScript.cs:91 
  at Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync[T] (System.String code, Microsoft.CodeAnalysis.Scripting.ScriptOptions options, System.Object globals, System.Type globalsType, System.Threading.CancellationToken cancellationToken) [0x00000] in /_/src/Scripting/CSharp/CSharpScript.cs:121 
  at PastQuestionPapers_CSharp.ViewModels.Page_001ViewModel+<<get_ExecuteCommand>b__21_0>d.MoveNext () [0x00029] in C:\work\PastQuestionPapers_CSharp\PastQuestionPapers_CSharp\PastQuestionPapers_CSharp\ViewModels\Page_001ViewModel.cs:54 

該当のソースコード

(https://github.com/Jirobe/Sample)

試したこと:追記

mscorlib.dllを参照から足してみてもライブラリ名とならず、よくわからない状態になってしまいます。
イメージ説明
イメージ説明

試したこと2

教えてもらいましたMono.CSharpを試してみました。

下図のような結果となり、Xamarin.Formsでは動かないように見受けられました。

私の環境だと下記のエラーが消えないのですが、動くようです。

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yukke_

    2019/07/27 15:37

    Xamarinはわかりませんが、mscorlib.dllがないって言われているから、そのファイルを追加すればいいのではないでしょうか。

    キャンセル

  • Jirobe

    2019/07/27 20:16

    ご指摘ありがとうございます。すみません、試してはいたのですが記載していませんでした。「試したこと:追記」として記載しました。

    キャンセル

回答 1

checkベストアンサー

0

同じような issue が上がっていますが、まだ解決はしてないようです。

https://github.com/dotnet/roslyn/issues/24442

あんまり詳しくはないので的はずれかもしれませんが、.NET Standard や .NET Framework などの互換性の問題のような気がします。

Microsoft.CodeAnalysis.CSharp.Scripting ではなく、Mono.CSharp を試してはいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/19 21:05

    Xamarin.Android プロジェクト側で Mono.CSharp.Evaluator などを使いたいということでしょうか?

    もしそうであれば、共有プロジェクトにのみ `Mono.CSharp` をインストールしたあと、次のようなクラスを共有プロジェクトに追加し、
    ```cs
    using System.IO;

    namespace PastQuestionPapers_CSharp
    {
    public class Evaluator
    {
    public static string Evaluate(string code, out object result, out bool result_set)
    {
    var e = new Mono.CSharp.Evaluator(new Mono.CSharp.CompilerContext(new Mono.CSharp.CompilerSettings(), new Mono.CSharp.StreamReportPrinter(new StringWriter())));
    e.Evaluate(code, out result, out result_set);

    return result.ToString();
    }
    }
    }
    ```

    Xamarin.Android プロジェクト側 (例えば `MainActivity.cs`) から次のように呼び出せばイケます。
    ```cs
    var result = new object();
    var result_set = false;
    Evaluator.Evaluate("var x = 1; var y = 2; x + y", out result, out result_set);
    System.Diagnostics.Debug.WriteLine("result: " + result.ToString());
    ```

    キャンセル

  • 2019/08/19 21:14

    Xamarin.Forms で動くという意味です。
    GitHub のリポジトリーに、動くソリューションとスクリーンショットを貼った issue を作ったのでそちらも見てもらえれば何かわかるかもしれません。

    キャンセル

  • 2019/08/20 06:22

    プロジェクトのアップロード、大変恐縮です・・・
    すみません。

    > Xamarin.Android プロジェクト側で Mono.CSharp.Evaluator などを使いたいということでしょうか?

    スクリプト関連の実装はXamarin.Formsのみで考えています。

    >> GitHub のリポジトリーに、動くソリューションとスクリーンショットを
    > 貼った issue を作ったのでそちらも見てもらえれば何かわかるかもしれません。

    試してみました。
    実機のAndroid上で動きました。ありがとうございます!

    私の環境では下記のエラーがリビルドをしても、Visual Studioを開きなおしても消えないのですが、実行できます。エラーを残したまま動くのは初めて見るので驚いています。


    重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
    エラー NU1202 パッケージ Mono.CSharp 4.0.0.143 は monoandroid81 (MonoAndroid,Version=v8.1) と互換性がありません。 パッケージ Mono.CSharp 4.0.0.143 がサポートするもの: net45 (.NETFramework,Version=v4.5) PastQuestionPapers_CSharp.Android C:\Sample____\PastQuestionPapers_CSharp\PastQuestionPapers_CSharp.Android\PastQuestionPapers_CSharp.Android.csproj 1


    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る