2016-12-16 14 views
0

C#コードをメモリ内の文字列にコンパイルして実行時に使用する関数を作成しました。それはとてもうまくいく。実行時に参照されるアセンブリでコンパイル

次は小さなクラスライブラリ(mynew.dllと呼ぶことができます)を作成し、c:\ mylibraries \ mynew.dllに配置しました。

私のコードでは、参照アセンブリを追加できます。私はこれを好きです:

CSharpCodeProvider provider = new CSharpCodeProvider(); 
CompilerParameters parameters = new CompilerParameters 
{ 
    GenerateExecutable = false, 
    GenerateInMemory = true 
}; 

parameters.ReferencedAssemblies.Add(@"c:\mylibraries\mynew.dll"); 

CompilerResults results = provider.CompileAssemblyFromSource(parameters, mycode); 

ここで私のC#コード文字列(mycode)は "Execute"と呼ばれる関数です。私はこの機能でmynew.dllから名前空間とクラスを宣言するとき、私はこのエラーを取得:

Could not load file or assembly 'MyNew, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

私は、メインアプリケーションのbinに/デバッグフォルダ内のDLLをコピーすると、突然の作品が、私はドンされますこれが欲しい。私は実行時にコンパイルされたコードを、メインアプリケーションではなく、それを使いたいと思っています。

私はここに投稿する前にやったこの:

  • 検索StackOverflowの
  • グーグル使用し
  • は、メモリ内のディスクとしないように、DLLをコンパイルしようとしました。これはうまくいきました...問題は今、dllがIISでロックされていて、IISサーバーを再起動せずに削除できないということです。コードはいつでも変更でき、人々がウェブサイト上にいるときにサーバーを再起動したくないのでオプションはありません。

これを修正する方法はありますか?

+1

「のコードはいつでも変更することができ、」メモリ内のアセンブリは "をロードすると、あなたの空想メモリリークやジャグリング、多くの場合を除き、いずれかのあなたのために動作しないことを意味します「正しい」アセンブリ。一度ロードされると、(ソースに関係なく)アセンブリをアンロードすることはできません。 AppDomainをアンロードするだけでそれが実行されます。表現木を使って動的にコードを生成するのではなく、アセンブリをコンパイルする特別な理由はありますか? –

+0

dllにはたくさんのロジックがあります。ここでは、データベース処理や電子メール処理のライブラリについて考えてみましょう。コンパイルされたコードは必ずしも同じではなく、時にはデータベースの処理や電子メールの処理が必要になることがあります。説明するのは少し難しいかもしれません。私は、メインアプリケーションのbinディレクトリにない実行時にdllを参照したいだけです。 –

+0

@Aly El-Haddadこれはサンプルデータです。もちろん私は必要に応じて私の弦をエスケープしています。しかし、私はそれをあなたのために変更しました –

答えて

-1

Directory.GetFilesを使用してファイルシステムでアセンブリを検索し、System.Reflection.Assembly.LoadFileを使用してアセンブリを読み込み、必要な型を見つけます。具体的な種類を知る必要がないように、具体的なクラスによって実装されるインタフェースを使用します。

このスレッドは役立つはず:Finding objects that implement interface from loaded assembly -how to compare types?

関連する問題