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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1717閲覧

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

Jirobe

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

1クリップ

投稿2019/07/27 03:44

編集2019/08/19 21:26

前提・実現したいこと

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では動かないように見受けられました。

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

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/27 06:37

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

2019/07/27 11:16

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

回答1

0

ベストアンサー

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

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

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

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

投稿2019/07/29 03:09

korosonya

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jirobe

2019/08/19 12:02 編集

ご回答ありがとうございます。 教えていただきましたMono.CSharpを試してみました。 .Net Standardでは動かないようでした。 →すみません、.Net StandardではなくMono.Android側で互換がなさそうですね。 > .NET Standard や .NET Framework などの互換性の問題のような気がします。 確かにMicrosoft.CodeAnalysis.CSharp.Scriptingも.Net Standardでは無理なのかもしれないとしれないですね・・・ 諦めたいと思います。 調べていただき、ありがとうございました。
korosonya

2019/08/12 11:44

諦められてしまったようなのであくまで後学のために書きますが、おそらく共有プロジェクトにのみ `Mono.CSharp` をインストールすれば動きますよ。
Jirobe

2019/08/13 22:17

そうなのですか? 共有プロジェクトにあたる部分が.Net Standardのプロジェクトであると考えいます。 それが「試したこと2」となります。 そのプロジェクトのNuget以外には含めてはいないのですが下記のエラーが起きているのでそういうものかと思っていました。 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
korosonya

2019/08/13 22:39

共有プロジェクトにのみ `Mono.CSharp` をインストールし、実行部分を下記のような感じで適当に書き換えてリビルドするとエラーは消えますし、実行も出来てるので問題ないと思います。 ただ、インストール直後にエラーが出るのは私の環境でも再現できていて、なんでこれが出るのかはわかりません。 ```cs var result = new object(); var result_set = false; var e = new Mono.CSharp.Evaluator(new Mono.CSharp.CompilerContext(new Mono.CSharp.CompilerSettings(), new Mono.CSharp.StreamReportPrinter(new StringWriter()))); e.Evaluate(Text, out result, out result_set); Result = result.ToString(); ```
Jirobe

2019/08/19 12:02 編集

レスポンスが遅くて申し訳ありません・・・ Mono.CSharpですが、クラスライブラリ(.Net Standard)単体であれば、エラーもなくビルドできます。 これをクラスライブラリの実行モジュールにあたるXamarin.Androidのプロジェクトに参照させるようにXamarin.Formsで実装するとエラーがでます・・・ 私の環境の問題でしょうか? 一応、いろいろ最新にはアップデートしているのですが・・・ 後から思ったのですが、Xamarin.Formsで動くという意味ではなく「.Net Standardでは動かないようでした。」という間違った言葉に対する否定でしょうか?すみませんでした・・・
korosonya

2019/08/19 12: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()); ```
korosonya

2019/08/19 12:14

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

2019/08/19 21: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 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問