2012-04-19 52 views
4

我正在寫一個小的應用程序,它在使用功能從源代碼編譯一個文件(的.cs)代碼文件編制工作文件:我們如何添加嵌入的資源是從一個源文件在運行時

public static bool CompileExecutable(String sourceName) 
{ 
    //Source file that you are compliling 
    FileInfo sourceFile = new FileInfo(sourceName); 
    //Create a C# code provider 
    CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
    //Create a bool variable for to to use after the complie proccess to see if there are any erros 
    bool compileOk = false; 
    //Make a name for the exe 
    String exeName = String.Format(@"{0}\{1}.exe", 
    System.Environment.CurrentDirectory, sourceFile.Name.Replace(".", "_")); 
    //Creates a variable, cp, to set the complier parameters 
    CompilerParameters cp = new CompilerParameters(); 
    //You can generate a dll or a exe file, in this case we'll make an exe so we set this to true 
    cp.GenerateExecutable = true; 
    //Set the name 
    cp.OutputAssembly = exeName; 
    //Save the exe as a physical file 
    cp.GenerateInMemory = false; 
    //Set the compliere to not treat warranings as erros 
    cp.TreatWarningsAsErrors = false; 
    //Make it compile 
    CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceName); 
    //if there are more then 0 erros... 
    if (cr.Errors.Count > 0) 
    { 
     //A message box shows the erros that occured 
     MessageBox.Show("Errors building {0} into {1}" + 
      sourceName + cr.PathToAssembly); 
     //for each error that occured in the code make a separete message box 
     foreach (CompilerError ce in cr.Errors) 
     { 
      MessageBox.Show(" {0}" + ce.ToString()); 
     } 
    } 
    //if there are no erros... 
    else 
    { 
     //a message box shows compliere results and a success message 
     MessageBox.Show("Source {0} built into {1} successfully." + 
      sourceName + cr.PathToAssembly); 
    } 
    //if there are erros... 
    if (cr.Errors.Count > 0) 
    { 
     //the bool variable that we made in the beggining is set to flase so the functions returns a false 
     compileOk = false; 
    } 
    //if there are no erros... 
    else 
    { 
     //we are returning a true (success) 
     compileOk = true; 
    } 
    //return the result 
    return compileOk; 
} 

我想要實現的是添加用戶選擇的文件資源,這將用上面的功能被添加爲嵌入式資源到被編譯(圖像,MP3,AVI,TTF,...等)。

我們如何能夠嵌入資源添加到這是從在運行時源文件編譯的文件?

回答

9

你需要包含要嵌入的資源文件create a .resources file,然後使用EmbeddedResources屬性引用生成的資源文件在你CompilerParameter的實例。

按照從資源的指示在的.resources上述(引用System.Resources.ResourceWriter部分)的第一鏈路,這將產生一個臨時文件的文件部分。然後根據您的問題中的代碼(以及EmbeddedResources文檔中的示例),您將參考它的內容如下:

if (provider.Supports(GeneratorSupport.Resources)) 
{ 
    cp.EmbeddedResources.Add("pathToYourGeneratedResourceFile"); 
}