4

を使用CSharpCodeProviderしてアセンブリをコンパイルしていますが、物理ファイルを作成したくないため、CompileParameters GenerateInMemoryプロパティを に設定しています。true

コンパイル後、次のCompilerResultsようなことを行うことができます:-

 object x = cr.CompiledAssembly.CreateInstance("MyGeneratedClass");
 Console.WriteLine(x);

期待どおりの出力が得られましたCreateInstance。うまくいきました。

AppDomainただし、アセンブリに関するそのような知識がなくても、現在の型にアクセスできる必要があります。私はこのようなことをする必要があります:-

 Type t = Type.GetType("MyGeneratedClass");
 object x = Activator.CreateInstance(t);

問題は、このコードtが null になってしまうことです。アセンブリはコンパイルされていますが、ロードされていないと思われます。このアセンブリをドメインにロードして、その型名を解決できるようにする方法を見つけることができないようです。

誰でも私を啓発できますか?

4

2 に答える 2

6

残念ながら、それは明らかに不可能です。

Type.GetTypeのドキュメントには、次のように明確に記載されています。

GetType が呼び出されたときにアセンブリがディスクに保存されていない場合、メソッドは null を返します。GetType は一時的な動的アセンブリを認識しません。したがって、一時的な動的アセンブリで GetType を呼び出して型を取得すると、null が返されます。

通常のアセンブリと同じように動作させたい場合は、アセンブリをディスクに書き込む必要があります。

于 2011-03-11T19:12:27.887 に答える
5

GenerateInMemory プロパティはパーラー トリックです。C# コンパイラは、プログラムのメモリに書き込む方法を認識していません。これは偽物で、コンパイラは実際にアセンブリを TEMP ディレクトリに書き込むように求められます。FileStream を byte[] に、次に Assembly.Load(byte[]) を使用してコンパイルが成功した後、メモリに読み込まれる場所から。Reflector の Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch() メソッドを参照してください。

とにかくファイルを作成するので、あまり目立たないだけなので、ファイルを作成してAppDomainにロードするだけで問題を解決できます。

于 2011-03-11T19:09:36.390 に答える