2012-03-06 5 views
1

私はCodeDomProviderを使用してメモリ内のC#コードをコンパイルし、コードを実行しています。コンソールアプリケーションでコードを実行すると、すべてうまく動作します。それがコンパイルされ、実行して結果を得ることができます。CodeDomProvider Webプロジェクトでコード生成に失敗しますが、コンソールアプリケーションではありません

しかし、この同じコードは、Webアプリケーション内で実行しようとすると失敗します。私はBadImageFormatExceptionを取得し、内部例外はBad IL Formatです。

私が気付いていないWebアプリケーションとコンソールアプリケーションにはいくつかの制限がありますか?

ありがとうございます。

私は.NET 4.0を実行しています。

編集:プロジェクトから別のアセンブリへの参照を追加するまで、すべてが機能していることに気付きました。だから私は私のエンティティモデルを含むプロジェクト参照を持つクラスライブラリを持っています。私はちょうど私のクラスは文字列を返した後、すべての作品をMyApp.Data.dllへの追加の参照を削除し、単一のメソッドを持たせる場合は

CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
CompilerParameters cp = new CompilerParameters(); 

cp.GenerateInMemory = true; 
cp.ReferencedAssemblies.Add("mscorlib.dll"); 
cp.ReferencedAssemblies.Add("System.dll"); 
cp.ReferencedAssemblies.Add("System.Core.dll"); 
cp.ReferencedAssemblies.Add("System.Data.Linq.dll"); 
cp.ReferencedAssemblies.Add("System.Data.Entity.dll"); 
cp.ReferencedAssemblies.Add("MyApp.Data.dll"); 

var results = provider.CompileAssemblyFromSource(cp, source); 
var assm = results.CompiledAssembly; 

:私は、同様の参照としてそれを追加しています。私はその参照を追加するとすぐに失敗します。

アイデア?

答えて

0

参照アセンブリの追加に失敗したため、私はBingingをいくつか行い、this discussionを見つけました。基本的には、コードがdllを見つけるためにServer.MapPathを使用する必要があるという問題でした。

cp.ReferencedAssemblies.Add(HttpContext.Current.Server.MapPath("bin\\MyApp.Data.dll")); 

これで機能します。だからそれは簡単な間違いだった。 :)

0

私は、昨年完成したほぼすべてのプロジェクトで、Webアプリケーションからオンザフライでコードを作成しているので、間違いなく実用的です。

セキュリティには違いがありますが、許可例外が表示されます。おそらくBadImageFormatExceptionではありません。

もう一つの違いは、Webアプリケーションのデフォルトはあなたの実際のコードを投稿したい場合がありAny CPU, 4.0.

であるのに対し、コンソールアプリケーションのデフォルトのビルドのプロファイルは、x86 4.0 Client Profileであるということです。誰かが問題を発見するかもしれません。

+0

ありがとうございました。私はそれが何か簡単だと思っていた。 :)私はすぐにいくつかのコードを掲載します。 – Bryant