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 から名前空間とクラスを宣言すると、次のエラーが発生します。

ファイルまたはアセンブリ 'MyNew、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

メイン アプリケーションの bin/debug フォルダーに dll をコピーすると、突然動作しますが、これは望ましくありません。メインアプリケーションではなく、実行時にコンパイルされるコードを使用したい。

ここに投稿する前にこれを行いました:

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

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

4

1 に答える 1

-1

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

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

于 2016-12-16T12:20:31.160 に答える