使用嵌入式资源的Visual Studio代码或命令

9

有人能为我提供一个使用C#访问嵌入式资源的起点或代码吗?

我已经成功地嵌入了一些批处理文件、脚本和CAD图纸,我想运行批处理并将脚本和CAD文件复制到批处理文件中指定的位置。

我不知道如何指定项目是什么,并在EXE中设置路径。以下代码是我认为可以工作的,但它失败了,我在网上找到的其他代码都与XML文件相关。

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + "\\Batchfile.bat";
p.Start();

说实话,我甚至不知道我是否采用了正确的方法来处理这个问题,因为这是我第一次使用C#或Visual Studio。


不确定这是否相关,但我在处理htmlhta文件时遇到了类似的问题:http://stackoverflow.com/questions/37965304/how-to-store-hta-html-file-in-project-resources-and-use-in-program - Bassie
还有关于如何执行 .bat 文件的详细信息,请参见此问题 - 似乎您必须在运行它们之前将它们复制到磁盘上:http://stackoverflow.com/questions/15141010/how-to-run-embedded-batch-file-using-process-start-in-c-sharp - Bassie
1个回答

14

在打开“解决方案资源管理器”并添加您想要嵌入的文件后,右键单击文件,然后单击属性。 在属性窗口中将生成操作更改为嵌入的资源

Embedding Resource Visual Studio

之后,您应该将嵌入式资源写入文件以使其能够运行。

using System;
using System.Reflection;
using System.IO;
using System.Diagnostics;

namespace YourProject
{
    public class MyClass
    {
        // Other Code...

        private void StartProcessWithFile()
        {
            var assembly = Assembly.GetExecutingAssembly();
            //Getting names of all embedded resources
            var allResourceNames = assembly.GetManifestResourceNames();
            //Selecting first one. 
            var resourceName = allResourceNames[0];
            var pathToFile = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) +
                              resourceName;

            using (var stream = assembly.GetManifestResourceStream(resourceName))
            using (var fileStream = File.Create(pathToFile))
            {
                stream.Seek(0, SeekOrigin.Begin);
                stream.CopyTo(fileStream);
            }

            var process = new Process();
            process.StartInfo.FileName = pathToFile;
            process.Start();
        }
    }
}

1
我会将代码示例分解一些,这样它就不会看起来像你的 assembly 声明等都是文件顶部的 using 语句的一部分。让它看起来像任何人都可以轻松阅读的真正代码。 - krillgar
谢谢,我不太理解这段代码以及它是如何让我选择特定文件的,但它给了我一个开始的方向。 - 3rutu5
玩一下这行代码:var resourceName = allResourceNames[0];allResourceNames是一个包含嵌入资源名称的字符串数组。 - Orkhan Alikhanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接