这是我尝试在程序中打开OpenFileDialog时收到的错误消息:
"在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式.确保Main函数上标记了STAThreadAttribute.仅当调试器附加到进程时才会引发此异常."
此错误消息的问题是我的Main方法DOES附加了STAThread属性.我不知道如何处理这个问题.如果它已经存在,我怎么能添加一些东西.加倍它并不是一个好选择,我尝试删除它,构建应用程序,添加它并再次构建它没有成功.我只是不明白.
private void btnOldFind_Click(object sender, EventArgs e)
{
openFileDialog1.Multiselect = false;
openFileDialog1.FileName = "";
openFileDialog1.ShowHelp = false;
openFileDialog1.AutoUpgradeEnabled = true;
openFileDialog1.InitialDirectory = @"C:\";
openFileDialog1.Filter = "Microsoft Installer (*.msi)|*.msi|All Files (*.*)|*.* ";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBoxOldInstallation.Text = openFileDialog1.FileName;
}
}
Run Code Online (Sandbox Code Playgroud)
主要方法是:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
Run Code Online (Sandbox Code Playgroud)
并且没有明确地进行线程化.说实话,这是一个非常基本的计划.
EDIT2 :: …
我正在尝试进行重大升级,但它无法正常工作.它只是将新程序与旧程序一起安装.他们是在不同的目录(如我的新版本改变了目录结构),所以没有冲突,但旧的需求,以被删除我的产品正常运行.
<Property Id="UPGRADE_NEEDED" Secure="yes" />
<Property Id="SAME_OR_NEWER_VERSION" Secure="yes" />
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize" />
</InstallExecuteSequence>
<Upgrade Id="{PUT-YOUR-GUID-HERE}">
<UpgradeVersion Minimum="5.1.3" OnlyDetect="yes" IncludeMinimum="yes" Property="SAME_OR_NEWER_VERSION" />
<UpgradeVersion Minimum="5.1" Maximum="5.1.3" Language="1033" Property="UPGRADE_NEEDED" MigrateFeatures="yes" IncludeMinimum="yes" />
Run Code Online (Sandbox Code Playgroud)
这是我的升级元素(当然删除了GUID).如果有人能找到问题所在,我将非常感激.
我想知道是否有任何方法可以创建可以编辑XML文档中的行的批处理文件.该行将由前一行标识.这个想法如下:
If line == Csetting name="BaseDirectory" serializeAs="String">
Next line = <value>User Input from begining of batch</value>
Run Code Online (Sandbox Code Playgroud)
就是那种甚至可能的东西,还是我在外面做梦?感谢您的帮助和答案.
我会尽量把它说清楚,但如果你有问题或不完全理解,请告诉我。
我有一个从头开始创建 WXS(WiX 源代码文件)的程序,并对其进行测试以确保它有效。我希望下一个自动步骤是使用 Visual Studio 实际构建 WXS(我正在使用 VS 2008 开发人员版/团队套件版)。我知道可以从 VS 中构建 WiX 项目(其中包含 WXS),并且 WiX 还带有用于构建的命令行实用程序。我正在寻找的是最好的选择。该程序是一个没有 GUI 的命令行实用程序。我知道可以在我的程序中使用命令行,但我不知道如何将它与创建的文件的可变目标和文件名一起使用。朝着正确方向的推动将不胜感激。
我有一个项目,我创建WiX(Windows Installer for XML)文件,当它们不存在时.它工作得很好.现在我想扩展它以添加更多功能.我想知道是否有办法以编程方式创建Visual Studio项目?这个项目是作为我们每晚构建过程的一部分运行的,当需要一个新的wix文件时,它会被创建,但是我希望在构建完成后将所有内容都安装好,所以如果有必要,你可以在Visual Studio中打开项目,开始编辑.我是在梦境之外做梦还是不在?任何推动正确的方向将非常感激.
我有点难以理解使用Package元素获得Comments和Keywords属性的观点.WiX主页简单地说"浏览的可选评论"和"用于浏览的可选关键字".那里没有太大的帮助.它们是用在ARP中,还是只用于制作MSI的细节或者是什么?谢谢(你的)信息!
情况就是这样.我有一个线程,只需单击一个按钮即可开始.它然后工作大约2分钟(给予或采取相当多)然后完成,更新UI和一直.这很好.现在我决定在混音中添加一个"取消"按钮.我的问题是什么是从外部阻止线程的最佳方法?什么方法最好完全避免?我可以通过哪些资源了解自己,以获得有关该主题的更多知识.
另一条信息.该程序不是由我编写的,我只是"继承"它,现在我试图以小的方式扩展它的功能,使其更加用户友好.
编辑:使用VS2008和.NET 3.5
可以说我有以下代码
public static string GetXMLValue()
{
XDocument settingsFile = XDocument.Load("Settings.xml");
return settingsFile.Element("Settings").Element("GenericValue").Value;
}
Run Code Online (Sandbox Code Playgroud)
它只是读取XML设置文件并返回GenericValue值.它不能比那更简单.现在我的问题是,它是否会提供任何好处(可读性,性能,语法,维护等),首先将返回值放在字符串变量中然后返回?或者最好离开它的方式?
try
{
list = from XElement e in d.Descendants(wix + "File")
where e.Attribute("Name").Value.Contains(temp.Name) &&
e.Parent.Parent.Attribute("Name").Value.Contains(temp.Directory.Name)
select e;
}
catch (NullReferenceException e)
{
MessageBox.Show(e.Message);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是为什么这段代码产生运行时错误,说我有一个未处理的NullReferenceException.如果您需要有关该计划的更多信息,请通知我.
编辑:调试器指向linq语句的"where"部分.当我直接从exe文件运行这个程序时,我仍然得到异常.
c# ×6
wix ×4
batch-file ×1
coding-style ×1
command-line ×1
exception ×1
try-catch ×1
wix3 ×1
xml ×1