.net 自带的安装项目能不能写安装脚本?或者说以下的要求如何实现或用其他的制作安装程序是否可以实现

wartim 2008-11-14 10:21:54
假设解决方案里有一个dll(比如XXX.dll,类名为X):
内部有个参数:public static bool DEBUG = true / false;
dll 调用状况:
解决方案里所有的项目都引用过这一dll,换句话说,每个项目内部都有一些会根据X.DEBUG设置为true或false执行一些不同代码的区块。
安装项目:
解决方案里包含了一个安装项目,包含了所有解决方案内项目产生的exe和dll。
编译目录:
建立一系列目录用来分门别类,比如:
项目编译后输出路径统一为: C:\X\
并制作了两个批处理文件
A.BAT : 用于在 X.DEBUG = true 下编译出来的exe和dll 从 C:\X\ 目录下 Copy 到 C:\X\A,一次类推,还把部分的dll Copy 到了 C:\X\AA 等...。
B.BAT : 用于在 X.DEBUG = false 下编译出来的exe和dll 从 C:\X\ 目录下 Copy 到 C:\X\B,一次类推,还把部分的dll Copy 到了 C:\X\BB 等...。
现在是编译后手动选择两个批处理文件其中之一运行。
要求:
当XXX.dll内部X.DEBUG = true 后 编译解决方案,
自动运行A.BAT(等于是实现解决方案的“生成后事件”),而且安装项目自动打包并把安装程序输出到比如 C:\X\DebugSetup\Setup.msi
自动运行B.BAT(等于是实现解决方案的“生成后事件”),而且安装项目自动打包并把安装程序输出到比如 C:\X\PublishedSetup\Setup.msi
也就是
1.自动按静态变量值拷贝编译出来的exe和dll到不同的目录,这些exe和dll用来更新服务端程序或上传IIS。
2.然后自动按静态变量值打包编译出来的exe和dll成安装程序msi到不同的目录,用来更新前台程序。
...全文
103 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiyuzhongxin789 2008-11-16
  • 打赏
  • 举报
回复
InstallContext 类:InstallContext 通常由安装程序集的可执行安装文件(如 InstallUtil.exe)创建。安装程序调用 InstallContext 构造函数,然后将默认日志文件路径和命令行参数传递给它。

调用其 Install、Commit、Rollback 或 Uninstall 方法之前,安装程序将 Installer 的 Context 属性设置为 InstallContext 的实例。调用这些方法之前,包含 Installers 属性中的安装程序集合的 Installer,设置所包含的每个安装程序的 Context 属性。

Parameters 属性包含命令行(输入它来运行可执行安装文件)的已分析版本。该属性包含的信息有:日志文件的路径,是否在控制台上显示日志信息,以及是否在安装过程中显示用户界面等。调用 IsParameterTrue 方法,以弄清命令行参数是否为 true。

使用 LogMessage 方法将状态消息写入安装日志文件和控制台。
周公 2008-11-16
  • 打赏
  • 举报
回复
下面的示例说明 InstallContext 构造函数、Parameters 属性以及 InstallContext 类的 LogMessage 和 IsParameterTrue 方法。

当调用安装程序的 Install 方法时,它从命令行检查是否有参数。根据检查的结果,它将进度消息显示在控制台上,并将它保存到指定的日志文件中。

不带任何参数调用程序时,将创建一个空的 InstallContext。指定“/LogFile”和“/LogtoConsole”后,将通过向 InstallContext 传递各自的参数来创建 InstallContext。


using System;
using System.ComponentModel;
using System.Configuration.Install;
using System.Collections;
using System.Collections.Specialized;

namespace MyInstallContextNamespace
{
[RunInstallerAttribute(true)]
class InstallContext_Example : Installer
{
public InstallContext myInstallContext;

public override void Install( IDictionary mySavedState )
{
StringDictionary myStringDictionary = myInstallContext.Parameters;
if( myStringDictionary.Count == 0 )
{
Console.WriteLine( "No parameters have been entered in the command line "
+"hence, the install will take place in the silent mode" );
}
else
{
// Check whether the "LogtoConsole" parameter has been set.
if( myInstallContext.IsParameterTrue( "LogtoConsole" ) == true )
{
// Display the message to the console and add it to the logfile.
myInstallContext.LogMessage( "The 'Install' method has been called" );
}
}

// The 'Install procedure should be added here.
}

public override void Uninstall( IDictionary mySavedState )
{
// The 'Uninstall' procedure should be added here.
}

public override void Rollback( IDictionary mySavedState )
{
if( myInstallContext.IsParameterTrue( "LogtoConsole" ) == true )
{
myInstallContext.LogMessage( "The 'Rollback' method has been called" );
}

// The 'Rollback' procedure should be added here.
}

public override void Commit( IDictionary mySavedState )
{
if( myInstallContext.IsParameterTrue( "LogtoConsole" ) == true )
{
myInstallContext.LogMessage( "The 'Commit' method has been called" );
}

// The 'Commit' procedure should be added here.
}

static void Main( string[] args )
{
InstallContext_Example myInstallObject = new InstallContext_Example();

IDictionary mySavedState = new Hashtable();

if( args.Length < 1 )
{
// There are no command line arguments, create an empty 'InstallContext'.
myInstallObject.myInstallContext = new InstallContext();
}

else if( ( args.Length == 1 ) && ( args[ 0 ] == "/?" ) )
{
// Display the 'Help' for this utility.
Console.WriteLine( "Specify the '/Logfile' and '/LogtoConsole' parameters" );
Console.WriteLine( "Example: " );
Console.WriteLine( "InstallContext_InstallContext.exe /LogFile=example.log"
+" /LogtoConsole=true" );
return;
}

else
{
// Create an InstallContext object with the given parameters.
String[] commandLine = new string[ args.Length ];
for( int i = 0; i < args.Length; i++ )
{
commandLine[ i ] = args[ i ];
}
myInstallObject.myInstallContext = new InstallContext( args[ 0 ], commandLine);
}

try
{
// Call the 'Install' method.
myInstallObject.Install( mySavedState );

// Call the 'Commit' method.
myInstallObject.Commit( mySavedState );
}
catch( Exception )
{
// Call the 'Rollback' method.
myInstallObject.Rollback( mySavedState );
}
}
}
}
周公 2008-11-16
  • 打赏
  • 举报
回复
InstallContext 类:InstallContext 通常由安装程序集的可执行安装文件(如 InstallUtil.exe)创建。安装程序调用 InstallContext 构造函数,然后将默认日志文件路径和命令行参数传递给它。

调用其 Install、Commit、Rollback 或 Uninstall 方法之前,安装程序将 Installer 的 Context 属性设置为 InstallContext 的实例。调用这些方法之前,包含 Installers 属性中的安装程序集合的 Installer,设置所包含的每个安装程序的 Context 属性。

Parameters 属性包含命令行(输入它来运行可执行安装文件)的已分析版本。该属性包含的信息有:日志文件的路径,是否在控制台上显示日志信息,以及是否在安装过程中显示用户界面等。调用 IsParameterTrue 方法,以弄清命令行参数是否为 true。

使用 LogMessage 方法将状态消息写入安装日志文件和控制台。
cpio 2008-11-14
  • 打赏
  • 举报
回复
可以在安装目录下设置A和B两个目录,把Release和Debug的内容分别放在两个目录里面
wartim 2008-11-14
  • 打赏
  • 举报
回复
有点写错了,更正一下:



假设解决方案里有一个dll(比如XXX.dll,类名为X):
内部有个参数:public static bool DEBUG = true / false;
dll 调用状况:
解决方案里所有的项目都引用过这一dll,换句话说,每个项目内部都有一些会根据X.DEBUG设置为true或false执行一些不同代码的区块。
安装项目:
解决方案里包含了一个安装项目,包含了解决方案内项目内产生的所有前台安装程序需要的exe和dll。
编译目录:
建立一系列目录用来分门别类,比如:
项目编译后输出路径统一为: C:\X\
并制作了两个批处理文件
A.BAT : 用于在 X.DEBUG = true 下编译出来的exe和dll 从 C:\X\ 目录下 Copy 到 C:\X\A,一次类推,还把部分的dll Copy 到了 C:\X\AA 等...。
B.BAT : 用于在 X.DEBUG = false 下编译出来的exe和dll 从 C:\X\ 目录下 Copy 到 C:\X\B,一次类推,还把部分的dll Copy 到了 C:\X\BB 等...。
现在是编译后手动选择两个批处理文件其中之一运行。
要求:
当XXX.dll内部X.DEBUG = true 后 编译解决方案,
自动运行A.BAT(等于是实现解决方案的“生成后事件”),而且安装项目自动打包并把安装程序输出到比如 C:\X\DebugSetup\Setup.msi
当XXX.dll内部X.DEBUG = false 后 编译解决方案,
自动运行B.BAT(等于是实现解决方案的“生成后事件”),而且安装项目自动打包并把安装程序输出到比如 C:\X\PublishedSetup\Setup.msi
也就是
1.自动按静态变量值拷贝编译出来的exe和dll到不同的目录,这些exe和dll用来更新服务端程序或上传IIS。
2.然后自动按静态变量值打包编译出来的exe和dll成安装程序msi到不同的目录,用来更新前台安装程序。
wartim 2008-11-14
  • 打赏
  • 举报
回复
我是要自动拷贝不同的dll到多个子目录里去,如果这个不考虑,安装项目的输出目录能不能分别设置Release和Debug版本的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧