問題タブ [csharpcodeprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
328 参照

c# - CSharpCodeProvider: 参照されているアセンブリの別のバージョンを参照しています

ProjectMainに Project への参照があるとしますRef。ではMain、 を定義し、CSharpCodeProviderそれを使用して実行時にコードをコンパイルします。

実行時にコンパイルされるコードをRef正しく実行するには、新しいバージョンの Project が必要になる場合があります。Ref.Dllそこで、相対サブフォルダー ( plugins) に新しいものを追加しようとしました。

また、以下を追加しました。

問題は、スクリプトを動的にコンパイルしようとするとRef.dll、メイン フォルダーの が使用され、エラーが発生することです。

Refそれで、私のスクリプトだけのために新しいプロジェクトを参照する最良の方法は何でしょうか?
PS動的に実行されるコードは現在のAppDomainにロードされたコードと結合され、分離できないため、別のAppDomainを作成する必要がないことを本当に望んでいます。

0 投票する
1 に答える
347 参照

c# - ソース コードを含む文字列から Class オブジェクトを作成する

コードが実行時にコンパイルされ、コードが文字列に含まれる C# アプリケーションを作成しています (文字列は ScintillaNET コントロールから値を取得し、テキストを返すだけで、コードを含む文字列は意図したとおりに機能します)。

私の質問は: 実行時にこのソース コードからある種のクラス オブジェクトを作成する方法はありますか? たとえば、文字列には次の値が含まれます。

このコードは、実行時に CSharpCodeProvider コンパイラによってコンパイルされています (コンパイルするクラスの配列を渡しているため、CompileAssemblyFromSourceBatch を使用)。ただし、実行時にコンパイラの MainClass プロパティを設定できるようにしたいので、クラスから名前空間を取得する必要があります。

そこで、各クラスのソースコード文字列のある種のオブジェクトを作成して、目標を達成できるようにすることを考えていました。もちろん、他のアイデアも大歓迎です。

0 投票する
1 に答える
156 参照

c# - csharpcodeprovider を使用して自動生成された C# ソース コードの変更を検出する

生成後に CSharpCodeProvider で自動的に生成される c# コードに変更が存在することを検出する必要があります。

ビルドインソリューションはありますか? 私は自分のソリューションを作成できます (コメントに CRC を追加します)... しかし、.NET フレームワークによって提供される組み込みのソリューションを検索します。

#Pragma checksumをチェックしますが、ソースとバイナリ間の変更のみを検出します。

0 投票する
1 に答える
737 参照

c# - 再コンパイルせずに CSharpCodeProvider からコンパイル済みアセンブリにアクセスする方法

Microsoft.CSharp.CSharpCodeProvider CompileAssemblyFromSource が機能しています。必要なものを間違いなく作成して返します。

コンパイルされたコードが最終的にアセンブリに含まれ、アプリ ドメインが破棄されるまで削除できないことはわかっています。

CompileAssemblyFromSource(myParams, myScript) を毎回呼び出すことなく、コンパイル済みの呼び出しをどのように再利用しますか?

myParams.OutputAssembly = 'MyAssembly"; を設定すると、そのインスタンスをインスタンス化できないようです。

コードがメモリ内にある場合、そこにあるかどうかを確認する方法と、CompileAssemblyFromSource() を呼び出さずに再ロードする方法を教えてください。

0 投票する
1 に答える
121 参照

c# - コンパイル機能オンザフライで文字列から

いくつかのコードを含む文字列string input;があります(以下はすべてその文字列にあります)

今、私は次のシナリオを達成したいと思います:

実際の T1、TResult は既知 (ここでは文字列、文字列) であり、その入力の名前は "s" であると仮定します。私はこのようにそれを達成することができます:

しかし、その方法はかなり複雑です。Func<T1, TResult>コンパイルされたアセンブリ全体ではなく、クラスをインスタンス化する (または静的メソッドを呼び出す)だけが必要であることがわかっている場合、これを単純化する方法はありますか?

もちろん、このコードをうまくドレスアップすることもできます。ジェネリック クラスでラップし、T1、TResult 型名を取得してTempClassテンプレートに入れます ( String.Format("public {0} temp_func({1} s)",typeof(TResult).Name, typeof(T1).Name);)。乗り心地が滑らか...

0 投票する
0 に答える
179 参照

c# - badimageformatexception 動的コード生成

特定のdllから1つのメソッドを呼び出すことだけを目的とするCSharpCodeProviderを使用して、実行可能ファイルを動的に生成しようとしています。生成されたファイルを実行すると、BadImageFormatException が発生します。

プラットフォームは既に x86 に設定しています。メソッドを呼び出すコードを手動で記述し、Visual Studio でデバッグすると、完全に正常に動作します。

これは実行可能ファイルのコードです:

コードを動的にコンパイルする前に、アセンブリを追加します

実行可能ファイルをdllと同じディレクトリに書き込みます。

編集

これは、コンパイラを呼び出すために使用するコードです。

0 投票する
0 に答える
314 参照

c# - .Net MVC で CSharpCodeProvider を使用した場合のパフォーマンスの問題

ユーザーが条件を作成してデータベースに保存できるという要件がありました

たとえば。if(FB > 5000) then 100 でなければ 200

ユーザーは数式を作成できますが、私の主な主な問題はその数式を実行することです

そのため、実行時FB に特定の値に置き換えられ、適切な文字列が生成されます

つまり、int a; if(6000 > 5000) {a= 100}else {a= 200}

実行時に上記のメソッドを実行するために、私は使用しましたCSharpCodeProvider

それも正常に動作していますが、私の問題は時間がかかりすぎることです。つまり、パフォーマンスが非常に遅いため、同じことを達成するための代替手段はありますか???

0 投票する
1 に答える
366 参照

c# - C# CSharpCodeProvider と BinaryFormatter を使用して実行時にシリアル化可能なオブジェクトをコンパイルする方法

そう、

次のコードをテキストとして持っています。

CSharpCodeProvider を使用して、実行時に上記のコードをコンパイルしたいと思います。

そして、以下は私がコンパイルする方法です:

問題は、コンパイル後に BinaryFormatter を使用してシリアル化し、ファイルに保存する必要があることです。

Serializableすでにタグでクラスをマークしていますが、以下のエラーが引き続き発生します。

アセンブリ '3k0rfezm、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null' のタイプ 'EntityModels.ActionInstance' は、シリアル化可能としてマークされていません。

ここから先の進め方がよくわかりません。残念ながら、CSharpCodeProvider と BinaryFormatter は要件の一部です。どんな助けでも本当に感謝しています。

乾杯!

0 投票する
1 に答える
78 参照

c# - オブジェクトを文字列コードに挿入/挿入する

実行時に動的に生成された C# コードがあり、 を使用System.CodeDom.CodeCompileUnitしてコンパイルします。Microsoft.CSharp.CSharpCodeProvider既に定義され初期化された変数 (ArrayList) をこの文字列に挿入して、コンパイル前に使用できるようにしたいのですが、どうすればよいですか?