2014-03-03 98 views
0

我想構建一個程序,它將編譯一個帶有xml文件的.cs作爲資源。我有以下代碼編譯:使用CSharpCodeDomProvider與資源文件編譯

private void Builder(bool run) 
{ 
    CodeDomProvider compiler = CodeDomProvider.CreateProvider("CSharp"); 
    string output = "Output.exe"; 
    string inputXml = "Input.xml"; 
    string xml = File.ReadAllText(inputXml); 
    string inputCS = Properties.Resources.Program; 
    IResourceWriter writer = new ResourceWriter("temp.resources"); 
    writer.AddResource("Story", xml); 
    writer.Close(); 
    CompilerParameters parameters = new CompilerParameters(); 
    //Make sure we generate an EXE, not a DLL 
    parameters.GenerateExecutable = true; 
    parameters.OutputAssembly = output; 
    parameters.GenerateInMemory = false; 
    parameters.ReferencedAssemblies.Add("System.dll"); 
    parameters.ReferencedAssemblies.Add("mscorlib.dll"); 
    parameters.ReferencedAssemblies.Add("System.Xml.dll"); 
    parameters.EmbeddedResources.Add("temp.resources"); 
    CompilerResults results = compiler.CompileAssemblyFromSource(parameters, inputCS); 
    if (run) 
    { 
     Process.Start(output); 
    } 
} 

但它有編譯錯誤,並說Properties不是來自Properties.Resources.Story有效的參考:

代碼從CS文件進行編譯

static bool LoadData() 
{ 
    bool result = true; 
    Program.doc = new XmlDocument(); 
    doc.LoadXml(Properties.Resources.Story); 
    return result; 
} 

更新:這是具體的錯誤:

c:\Users\Nick\AppData\Local\Temp\zk14fqrm.0.cs(38,25) : Error CS0103: The name 'Properties' does not exist in the current context

那麼這需要改變以解決這個問題呢?

+0

'CodeDomProvider'和'IResourceWriter'都是'IDisposable'。你應該在'using'語句中包裝它們的用法。 –

回答

2

是的,這是可以預料的。 Properties.Resources類是由Visual Studio代碼生成器自動生成的。這不是C#編譯器的功能。

所以,你仍然需要添加相應的Resources.Designer.cs文件,或者你需要調用代碼生成器爲你構建過程的一部分,並自動生成的文件添加到cs文件列表編譯

+0

添加無錯誤構建的'Properties.Resource'類,但運行時拋出'system.resources.missingmanifestresourceexception' – themightymanuel

+0

@themightymanuel這意味着您將資源文件放在錯誤的位置。它必須符合最初的'resx'所具有的「命名空間」。您可以通過'Designer.cs'文件查看適當的資源路徑。 – Luaan

3
writer.AddResource("Story", xml); 

這並沒有做到你希望的那樣。嵌入資源比嵌入資源要多一些lot。 IDE和msbuild.exe完成的大量工作使Properties.Resources代碼在運行時工作。粗略步驟:

  • Project + Properties,Resource選項卡,Add Resource生成一個.xml文件。據推測,這與您在代碼中使用的非常相似。
  • 這也會自動生成代碼,您可以通過打開Properties + Resources.resx + Resources.Designer.cs文件來查看它。正是這個文件聲明瞭Properties.Resources類。解釋編譯錯誤的編碼錯誤
  • 在構建時,.resx文件從XML轉換爲更緊湊且適合嵌入程序集的格式。這由Resgen.exe構建工具完成。它從.xml文件轉換爲.resources文件。請注意您是如何得到錯誤的,您正在將xml寫入.resources文件而不是Resgen.exe輸出。

使用CodeDom重現所有這一切確實非常痛苦,特別是自動生成的代碼步驟。實用的方法是將資源保存在文件中,而不是試圖嵌入它們,嵌入單個資源並在運行時使用Assembly.GetManifestResourceStream()檢索並顯式使用ResourceManager,如Resources.Designer.cs文件中所示。