C# コードをコンパイルし、実行時に出力を起動するアプリケーションがあります。これまでのところすべて順調に進んでいますが、WinForms アプリケーションをコンパイルしようとしているときに、参照されているアセンブリで問題が発生しています。
WinForms プロジェクトのプロジェクト フォルダー全体がアプリケーション内にあるため、.csproj ファイルを XML ファイルとして読み取って、参照されているすべてのアセンブリを取得します。したがって、次のように、参照されるアセンブリの名前を文字列として持っています。
System
Microsoft.CSharp
System.Drawing
System.Windows.Forms etc.
これらの名前だけを知っている実行時にこれらのアセンブリをロードすることは可能ですか? 私のシステムでのそれらの場所のパスはわかっていますが、アプリケーションは他の人のマシンでも正しく実行されるはずです。
アップデート
コンパイルは次のとおりです。クラスからのコードは、クラス ファイルから文字列形式で取得され、それらはすべて配列に格納されます。その配列は、CSharpCodeProvider コンパイラに渡されます。アプリケーションはコンソール プログラムだけで意図したとおりに動作しますが、(WinForms などで) アセンブリが参照されるとすぐに、もちろんこれらのアセンブリもコンパイルする必要があります。
だから私がやろうとしているのは、プロジェクトからすべてのアセンブリをコンパイルしてからロードして、実行時にアセンブリエラーが発生しないようにすることです。
私の現在のコードは次のように機能します:
var assemblies = AppDomain.CurrentDomain
.GetAssemblies()
.Where(a => !a.IsDynamic)
.Select(a => a.Location);
parameters.ReferencedAssemblies.AddRange(assemblies.ToArray()); //parameters is CompilerParameters
これは機能しますが、Visual Studio から参照されているすべてのアセンブリを追加するだけなので、良い方法ではありません (もちろん、すべてのマシンで機能するとは限りません)。