【问题标题】:Compiling with a resource file using CSharpCodeDomProvider使用 CSharpCodeDomProvider 编译资源文件
【发布时间】:2014-03-03 14:37:30
【问题描述】:

我正在尝试构建一个程序,该程序将使用 xml 文件作为资源编译一个 .cs。我有以下编译代码:

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):错误 CS0103:当前上下文中不存在名称“属性”

那么需要改变什么来解决这个问题?

【问题讨论】:

  • CodeDomProviderIResourceWriter 都是 IDisposable。您应该将它们的用法包含在 using 语句中。

标签: c# .net csharpcodeprovider


【解决方案1】:
    writer.AddResource("Story", xml);

这并没有达到你希望的效果。嵌入资源的意义远不止眼前所见。 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 文件中所示。

【讨论】:

    【解决方案2】:

    是的,这是意料之中的。 Properties.Resources 类由 Visual Studio 代码生成器自动生成。这不是 C# 编译器的特性。

    所以您仍然需要添加相应的 Resources.Designer.cs 文件,您需要在构建过程中调用代码生成器并将自动生成的文件添加到 cs 文件列表中编译。

    【讨论】:

    • 添加 Properties.Resource 类构建时没有错误但在运行时会抛出 system.resources.missingmanifestresourceexception
    • @themightymanuel 这意味着你把资源文件放错了。它必须适合原始resx 的“命名空间”。您可以查看 Designer.cs 文件以找到资源的正确路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2011-06-28
    相关资源
    最近更新 更多