2011-08-11 7 views
0

とタイプに空白を追加することができます私は、私は、これは組み立て空間を追加したいcode.Now私は、文字列からこの方法でアセンブリを取得しています。このが、私はコード

Assembly BuildAssembly(string code) 
     { 

      List<string> SKParams = new List<string>(); 
      string Caption = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\"; 
      SKParams.Add(Caption + "System" + ".dll"); 
      SKParams.Add(Caption + "System.Windows.Forms" + ".dll"); 
      SKParams.Add(Caption + "System.Data" + ".dll"); 
      SKParams.Add(Caption + "System.Core" + ".dll"); 
      SKParams.Add(Caption + "System.Drawing" + ".dll"); 
      SKParams.Add(Caption + "System.Drawing" + ".dll"); 
      SKParams.Add(@"D:\SK\Projelerim\ZxProject\MySDK\MySDK\bin\Debug\MySDK.dll"); 
      SKParams.Add(Caption + "System.XML" + ".dll"); 
      Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider(); 
      ICodeCompiler compiler = provider.CreateCompiler(); 
      CompilerParameters compilerparams = new CompilerParameters(SKParams.ToArray()); 

      compilerparams.GenerateExecutable = false; 
      compilerparams.GenerateInMemory = true; 

      CompilerResults results = compiler.CompileAssemblyFromSource(compilerparams, code); 
      if (results.Errors.HasErrors) 
      { 
       StringBuilder errors = new StringBuilder("Compiler Errors :\r\n"); 
       foreach (CompilerError error in results.Errors) 
       { 
        errors.AppendFormat("Line {0},{1}\t: {2}\n", 
          error.Line, error.Column, error.ErrorText); 
        MessageBox.Show(error.ErrorText); 
       } 
       throw new Exception(errors.ToString()); 
      } 
      else 
      { 
       return results.CompiledAssembly; 
      } 

     } 

気に入りまし形でコンパイラコードを持っており、アセンブリとソースコード(文字列コード)を変更するにはどうしたらいいですか?

+0

あなたがしようとしていることは(少なくとも私には)あまり明確ではありません。クラスを定義する文字列(コード)を渡すメソッドを持つアセンブリを作成した後、そのクラスにvoidメソッド(元のコードではない)を追加したいということですか? –

+0

exectlyはいMr.Baruchelli – YardimaIhtiyaciOlan

答えて

0

既存の型にメソッドを追加する唯一の方法は、System.Reflection.EmitにあるDynamicMethodクラスを使用することです。いくつかの助けとここでの例:http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspxを得ることができますが、あまりにユーザーフレンドリーではありません。文字列からこのメソッドを作成する場合は、文字列を解析し、一連の呼び出しで適切なOpCodeを使用してEmitに変換する必要があります。私はあなたが更新/追加されたコードを使ってアセンブリをもっと簡単に再作成できると思います。

クラスの既存のインスタンスに新しく追加したメソッドを適用する必要がある場合は、新しいアセンブリを作成し、新しいクラスのインスタンスを作成して、プロパティの古い値をリフレクションでコピーします。