0

リソースとしてxmlファイルを使用して1つの.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: 'Properties' という名前が現在のコンテキストに存在しません

では、これを修正するには、これを変更する必要がありますか?

4

2 に答える 2

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

それはあなたが望んでいることをしません。リソースの埋め込みには、目に見える以上のことがたくさんあります。実行時に Properties.Resources コードを機能させるために、IDE と msbuild.exe によって行われた多くの作業。大まかな手順:

  • [プロジェクト + プロパティ]、[リソース] タブ、[リソースの追加] により、.xml ファイルが生成されます。おそらく、コードで使用しているものと非常によく似たものです。
  • これにより、コードも自動生成されます。Properties + Resources.resx + Resources.Designer.cs ファイルを開くと確認できます。Properties.Resources クラスを宣言するのはこのファイルです。このステップは、コンパイルエラーを説明するコードで実行されていません
  • ビルド時に、.resx ファイルは XML から、よりコンパクトでアセンブリ内に埋め込むのに適した形式に変換されます。これは、Resgen.exe ビルド ツールによって行われます。.xml ファイルから .resources ファイルに変換されます。Resgen.exe 出力の代わりに .resources ファイルに xml を書き込んでいることに注意してください。

CodeDom を使用してこれらすべてを再現するのは、特に自動生成されたコード ステップでは非常に困難です。実用的なアプローチは、リソースを埋め込むのではなくファイルに保持し、単一のリソースを埋め込み、Assembly.GetManifestResourceStream() を使用して実行時に取得し、ResourceManager を Resources.Designer.cs ファイルに示されているように明示的に使用することです。

于 2014-03-04T17:42:01.270 に答える
2

はい、それは予想されることです。クラスは、Properties.ResourcesVisual Studio コード ジェネレーターによって自動的に生成されます。これは C# コンパイラの機能ではありません。

そのため、それぞれのResources.Designer.csファイルを追加する、ビルド プロセスの一部としてコード ジェネレーターを呼び出して、自動生成されたcsファイルをコンパイルするファイルのリストに追加する必要があります。

于 2014-03-04T17:04:49.397 に答える