C# 单个WinForms可执行文件的易于配置的命令参数?

C# 单个WinForms可执行文件的易于配置的命令参数?,c#,winforms,C#,Winforms,我创建了一个非常简单的Windows窗体应用程序,它使用.NET2.0并从单个可执行文件运行 这些单个可执行文件将部署到多个用户以提示和收集信息 问题是,我希望将信息通过电子邮件发送到特定的电子邮件地址,该地址可以根据可执行文件发送到的用户而有所不同。但是,我不想在电子邮件更改时重建可执行文件 当然,我可以通过命令行或快捷方式将命令参数传递给可执行文件,但我只想让用户在表单中输入信息,然后单击“提交”,并将其发送到预定义的电子邮件地址,该地址可能因可执行文件发送到的用户而异 我可以将可执行文件与

我创建了一个非常简单的Windows窗体应用程序,它使用.NET2.0并从单个可执行文件运行

这些单个可执行文件将部署到多个用户以提示和收集信息

问题是,我希望将信息通过电子邮件发送到特定的电子邮件地址,该地址可以根据可执行文件发送到的用户而有所不同。但是,我不想在电子邮件更改时重建可执行文件

当然,我可以通过命令行或快捷方式将命令参数传递给可执行文件,但我只想让用户在表单中输入信息,然后单击“提交”,并将其发送到预定义的电子邮件地址,该地址可能因可执行文件发送到的用户而异

我可以将可执行文件与批处理文件捆绑在一起,批处理文件通过命令参数或配置文件运行可执行文件。但是,我希望保持部署的简单性,如果可能的话,只需一个文件

有可能用MSI来实现这一点吗?我是不是完全错过了一些显而易见的东西


我希望将可执行文件发送给用户的人能够轻松更改WinForm将数据发送到的电子邮件地址。

您可以使用app.config文件

右键单击项目并选择添加->新建项->应用程序配置文件

有类似于:

<configuration>
  <appSettings>
    <add key="UserEmail" value="test@test.com" />
  </appSettings>
</coniguration>

然后,在将配置文件发送给用户之前,您只需更改配置文件中的值,用户也可以自行更新配置文件。

一个稍有不同的解决方案是让每个实例将电子邮件发送到相同的电子邮件地址,“发件人”是基于用户的Windows登录帐户和域的地址

然后,创建一个接收电子邮件的帐户,这些电子邮件通过过滤器到达该帐户,以将邮件重定向到适当的目的地。您并没有说您使用的是什么电子邮件系统,但Exchange非常简单地允许这样做,例如(像GMail这样的其他系统)


在这种集中式设计上,一个更为劳动密集的变体是创建一个小型的web服务,由exe查询,web服务告诉exe应该将邮件发送到哪里。同样,您需要Windows用户和“收件人”地址之间的映射表。

如果您的用户要更改电子邮件地址,您可能需要考虑一种比配置文件更简单的传递机制,这是脆弱的,因为如果用户意外删除
,您的应用程序将抛出
System.Configuration.ConfigurationErrorsException

一个比应用程序配置文件更简单的解决方案是一个文本文件,其中只包含目标电子邮件地址,与应用程序包含在同一目录中。您的用户可以更轻松地编辑它,或者只是在其中添加一个新文件。当然,这取决于他们拥有该目录的权限


另一个选择是将其视为正常设置。在第一次运行时提示最终用户输入实际电子邮件,并使用特定于用户的设置(即
Properties.Settings.Default.SettingName
)存储该电子邮件。然后,为您的用户提供一个UI功能,以便根据需要对其进行更改。

我不确定是否理解您的问题,但以下是我的尝试:

您应该在visual studio中签出属性:

项目
->
您的项目名称属性…
->
设置

您可以在那里创建变量,变量可以是应用程序范围的,也可以是用户范围的。通过使用用户范围的变量,比如说
userEmail
,程序允许您根据登录的用户保存此信息。通过这种方式,您可以在这个完全相同的可执行文件中保存20封不同的电子邮件,具体取决于登录的用户

根据用户保存电子邮件:

Properties.Settings.Default.userEmail = "myemail@host.com";
Properties.Settings.Default.Save();
并以同样的方式阅读:

string email = Properties.Settings.Default.userEmail;

正如我在原始问题中所说的,如果可能的话,我想将其保存到一个文件中。@lionpants没有多少应用程序只包含一个文件。另一个更复杂的选项是创建InstallShield安装程序,让它将电子邮件值写入注册表,然后在代码中从注册表中检索该值。@mclaassen,但即使如此,当地址需要更改时,您将重建某些内容。@DonBoitnott您为什么需要重建任何内容来更改app.config值?我指的是注册表的想法。无论是应用程序还是安装,只要地址发生变化,都必须重新构建该值。好主意。不幸的是,我之前不知道任何映射信息,也无法保证信息是从哪个域/用户名发送的。我可能不得不接受配置文件。配置文件确实是一种明智的方法,但它确实意味着额外的文件。关于我的解决方案,还有一点需要注意:只要您有一个您控制的域,您就可以将其用作原始域(即。WindowsAccount@yourDomain.com). 您也不需要事先知道映射信息;当电子邮件开始出现时,您可以将每个邮件添加到filter.Lol。是的,让我们创建一个web服务来处理逻辑,而不仅仅是添加一个配置文件(尽管这对于企业解决方案来说可能更好)@mclaassen-我肯定是在考虑企业,尽管我在微观层面也看到了一些非常疯狂的解决方案!当杰夫在下面提到这个解决方案时,我很激动。不幸的是,可执行文件将被发送到不同的计算机。发生这种情况时,用户保留的设置将丢失。不幸的是,将设置范围设置为应用程序并没有将其写入配置文件。我认为应用程序设置会很好地工作。不幸的是,可执行文件的部署如下。分类人员设置可执行文件>可执行文件的电子邮件地址,然后发送给用户>用户运行可执行文件。用户持久化设置有效,但当可执行文件发送给最终用户时,该设置将丢失。更改时,应用程序范围的设置不会写入配置文件。我想
string email = Properties.Settings.Default.userEmail;