C# “编写自己的安装程序”;“创造者”;在C中#

C# “编写自己的安装程序”;“创造者”;在C中#,c#,installation,zip,C#,Installation,Zip,我对编程没什么兴趣,所以如果这是个愚蠢的问题,请原谅 我知道有几个安装程序创建者,比如默认的VisualStudio安装程序项目、InstallShield、NSIS等等,但我认为如果我有自己的解决方案,那会很酷 假设我想创建自己的安装程序创建者,在这个工具中,我可以添加几个我想安装的文件,并定义自己的脚本系统(可能是基于XML的)。创建一个打包我添加到的所有文件的工具。。假设拉链是一个简单的步骤。但是我怎样才能开发出构建可执行文件的东西呢?这是如何实现的 任何建议和有用的提示都将不胜感激 一个

我对编程没什么兴趣,所以如果这是个愚蠢的问题,请原谅

我知道有几个安装程序创建者,比如默认的VisualStudio安装程序项目、InstallShield、NSIS等等,但我认为如果我有自己的解决方案,那会很酷

假设我想创建自己的安装程序创建者,在这个工具中,我可以添加几个我想安装的文件,并定义自己的脚本系统(可能是基于XML的)。创建一个打包我添加到的所有文件的工具。。假设拉链是一个简单的步骤。但是我怎样才能开发出构建可执行文件的东西呢?这是如何实现的


任何建议和有用的提示都将不胜感激

一个简单的方法是让一个程序接受一个标准的可执行文件,并在文件的正常结尾(用一个“魔术字”)后将数据附加到它。“标准可执行文件”所做的只是读取自身,找到标记数据开始的神奇单词并提取数据。当然还有其他更优雅的方法,尤其是对于较新的语言和运行时,但我提到的是一些基本的方法,甚至可以在普通C中实现


或者,使用.NET,您可以利用运行时编译器从库存代码动态创建可执行文件,我认为您还可以嵌入资源,就像您在VS项目中嵌入资源一样。不过,我并不是100%肯定这一点。

一个简单的方法是让一个程序接受一个标准的可执行文件,并在文件正常结束后将数据附加到该文件中(使用一个“魔术字”)。“标准可执行文件”所做的只是读取自身,找到标记数据开始的神奇单词并提取数据。当然还有其他更优雅的方法,尤其是对于较新的语言和运行时,但我提到的是一些基本的方法,甚至可以在普通C中实现


或者,使用.NET,您可以利用运行时编译器从库存代码动态创建可执行文件,我认为您还可以嵌入资源,就像您在VS项目中嵌入资源一样。不过,我不是100%肯定这一点。

我建议你看看。Wix是开源的,因此如果您急于编写一些安装程序代码,您可以为Wix源代码做出贡献。Wix还允许您用C#编写自己的自定义操作(如果愿意)。另外,它是基于xml的(通常你的安装程序是一堆xml文件),所以它似乎很好地满足了你的需要。

我建议你看看。Wix是开源的,因此如果您急于编写一些安装程序代码,您可以为Wix源代码做出贡献。Wix还允许您用C#编写自己的自定义操作(如果愿意)。另外,它是基于xml的(通常您的安装程序是一堆xml文件),因此它似乎很好地满足了您的需求。

不确定是否满足了您的需求。这就是我如何根据名为
BaseExecutable
的可执行文件,将一些数据附加到名为
filename
的文件中。数据可以是.zip或其他任何格式。
BaseExecutable
是某种类型的安装程序(在我的例子中是Win32可执行文件),它从本身读取附加数据。数据的起始位置可以在生成的可执行文件的位置44、45、46、47处找到。我没有在任何.NET exe中尝试过

public void Create(string Filename, string BaseExecutable)
{
    FileStream Source = new FileStream(BaseExecutable, FileMode.Open, FileAccess.Read, FileShare.Read);

    file = new FileStream(Filename, FileMode.Create, FileAccess.Write, FileShare.None);

    byte[] buffer = new byte[65536];
    Source.Read(buffer, 0, 48);
    file.Write(buffer, 0, 44);

    writer = new BinaryWriter(file, Encoding.ASCII);
    writer.Write((uint)Source.Length);

    int count;
    while ( (count=Source.Read(buffer, 0, buffer.Length))>0)
        file.Write(buffer, 0, count);

    // append custom data here ...
}

不确定这是否满足你的需要。这就是我如何根据名为
BaseExecutable
的可执行文件,将一些数据附加到名为
filename
的文件中。数据可以是.zip或其他任何格式。
BaseExecutable
是某种类型的安装程序(在我的例子中是Win32可执行文件),它从本身读取附加数据。数据的起始位置可以在生成的可执行文件的位置44、45、46、47处找到。我没有在任何.NET exe中尝试过

public void Create(string Filename, string BaseExecutable)
{
    FileStream Source = new FileStream(BaseExecutable, FileMode.Open, FileAccess.Read, FileShare.Read);

    file = new FileStream(Filename, FileMode.Create, FileAccess.Write, FileShare.None);

    byte[] buffer = new byte[65536];
    Source.Read(buffer, 0, 48);
    file.Write(buffer, 0, 44);

    writer = new BinaryWriter(file, Encoding.ASCII);
    writer.Write((uint)Source.Length);

    int count;
    while ( (count=Source.Read(buffer, 0, buffer.Length))>0)
        file.Write(buffer, 0, count);

    // append custom data here ...
}

不要重新发明轮子-只需使用Wix()。你想通过编写自己的程序来实现什么?你的可执行文件应该是.net应用程序还是win32(在没有安装.net的情况下运行)?安装程序从一个简单的概念变成了你必须担心的大量事情。就像@ShellShock所说的那样,坚持使用WiX——因为它涵盖了您的许多担忧。无论如何,您已经大致描述了WiX--
可能是基于XML的
@ShellShock为了学习,我确实想重新发明轮子不要重新发明轮子-只需使用Wix()。你想通过编写自己的程序来实现什么?你的可执行文件应该是.net应用程序还是win32(在没有安装.net的情况下运行)?安装程序从一个简单的概念变成了你必须担心的大量事情。就像@ShellShock所说的那样,坚持使用WiX——因为它涵盖了您的许多担忧。无论如何,您已经大致描述了WiX--
可能是基于XML的
@ShellShock为了学习,我确实想重新发明轮子我正在使用VS2012,但我还没有发现与此任务相关的选项。抱歉,以前提到VS2012是一个糟糕的词汇选择。我应该说是.NETFramework。请参阅我的编辑。我正在使用VS2012,但我还没有发现与此任务相关的选项。抱歉,以前提到VS2012是一个糟糕的词汇选择。我应该说是.NETFramework。查看我的编辑。如果我不想依赖现有的解决方案怎么办?我更感兴趣的是如何完成这项任务的理论方法。如果我不想依赖现有的解决方案呢?我对如何完成这项任务的理论方法更感兴趣。