我有点痛苦.我有安装程序安装并启动托盘图标应用程序(常见的.exe)
这工作正常,但现在我想在此UI之前停止该应用程序,告诉用户手动关闭应用程序,因为在卸载例程期间,我的托盘图标被删除但进程仍在运行.
我在卸载之前(甚至在执行期间)应用此自定义操作来关闭应用程序
<CustomAction Id="CloseTrayApp" ExeCommand="-exit" FileKey="TrayApp" Execute="immediate" Return="asyncNoWait" />
<InstallExecuteSequence>
<Custom Action="CloseTrayApp" Before="InstallValidate" />
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
但是"关闭所有正在运行的应用程序"对话框仍然会弹出,但我认为这将解决我的问题.
我已经尝试使用CloseAction但是由于编译时的错误而我急于使用它.它说WixUtils名称空间可能会丢失,但我仔细检查它是否存在:
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
Run Code Online (Sandbox Code Playgroud)
如何避免弹出对话框窗口并触发执行此自定义操作?
我浏览了stackoverflow上陈述的几个nunit和visual studio问题,但找不到我的情况适合的任何线程.
我正在使用NUnit来测试我编写的一些代码,我正在将我的testproject的*.csproj文件加载到NUnit GUI工具中.
我想出了我猜的问题,但到目前为止我没有解决方案.我在做什么:
我引用其他2个项目都是dll项目.这意味着我有3个项目:TestProject(DLL),SettingsManager(DLL),DatabaseInterface(DLL).所有都在一个解决方案.DatabaseInterface项目包含对另一个C++ x86 DLL的本机api调用,但不通过"using"语句显式引用此DLL.
其中一个是SettingsManager,存储一些配置数据,如路径等,但无论如何.Testproject和DatabaseInterface都引用了SettingsManager.
所有3个项目都在"Debug"和"AnyCPU"下构建.仅在我的TestProject中引用和使用SettingsManager工作正常,但是当我添加DatabaseInterface时,我得到一个BadImageFormatException,告诉我它正在尝试加载格式错误的文件.
为了使其更加明显,那就是:
using myNamespace.Settings; // contains SettingsManager
using System;
using NUnit.Framework;
namespace myNamespace.myTestProject
{
[TestFixture]
public class TestProject
{
[SetUp]
public void SetUp()
{
}
[Test]
public void ReadDbFile()
{
string s = SettingsManager.DbFile; // gets the path of the db file
}
}
}
Run Code Online (Sandbox Code Playgroud)
NUnit输出:
这不起作用:
using myNamespace.Settings; // contains SettingsManager
using myNamespace.DbInterface; // contains DatabaseInterface, which contains native calls to C++ dll
using System;
using NUnit.Framework;
namespace myNamespace.myTestProject
{ …Run Code Online (Sandbox Code Playgroud) 我必须将几个 jave 方法注释更改为 C# 注释语法,并且我正在寻找能够执行此转换的工具。
有谁知道一个能够将注释从java风格转换为c#风格的工具吗?
正如标题所说,我得到了一个定义了这种服务行为的WCF服务器:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
Run Code Online (Sandbox Code Playgroud)
我'使用命名管道绑定,我的客户端以这种方式连接:
NetNamedPipeBinding binding = new NetNamedPipeBinding();
const int maxValue = 0x40000000; // 1GB
binding.MaxBufferSize = maxValue;
binding.MaxReceivedMessageSize = maxValue;
binding.ReaderQuotas.MaxArrayLength = maxValue;
binding.ReaderQuotas.MaxBytesPerRead = maxValue;
binding.ReaderQuotas.MaxStringContentLength = maxValue;
// receive timeout acts like a general timeout
binding.ReceiveTimeout = TimeSpan.MaxValue;
binding.SendTimeout = TimeSpan.MaxValue;
ChannelFactory<IDatabaseSession> pipeFactory = new ChannelFactory<IDatabaseSession>(binding, new EndpointAddress("net.pipe://localhost/DatabaseService"));
IDatabaseSession dbSession = pipeFactory.CreateChannel()
Run Code Online (Sandbox Code Playgroud)
我开始的每个客户端执行上面的代码,并且对于每个客户端,CPU使用率提高了25%(实际上不是为5.客户端,但此时可执行的服务覆盖了整个CPU容量的近100%).
我正在寻找的是一种资源(网站/列表或只是你强大的知识)告诉我CreateChannel实际上做了什么(关于资源分配问题).
提示:即使没有实际进行通信,CPU使用率也会增加,只创建了Channel.
我遇到了一个奇怪的问题,甚至是WebRequest的行为.首先,这是我正在尝试做的事情:
Dim req As HttpWebRequest = CType(Net.WebRequest.Create("https://cloud.myweb.de/myenginge/dostuff"), HttpWebRequest)
Dim inputString As String = "text=DoStuff"
Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(inputString)
req.Method = "POST"
req.Accept = "application/xml;q=0.9,*/*;q=0.8"
req.ContentType = "application/x-www-form-urlencoded"
req.ContentLength = data.Length
str2 = req.GetRequestStream()
str2.Write(data, 0, data.Length)
str2.Close()
Dim resp As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)
str = resp.GetResponseStream()
buffer = New IO.StreamReader(str, System.Text.Encoding.ASCII).ReadToEnd
Run Code Online (Sandbox Code Playgroud)
但是在我的编译设置中设置.NET Frame 3.5将导致超时:
str2 = req.GetRequestStream()
Run Code Online (Sandbox Code Playgroud)
设置框架版本4.0工作,一切都通过,没有任何超时问题.有人知道为什么会这样吗?我也试过3.0,它也没用.
(我在这个例子中使用的是VB.NET,但也欢迎使用C#解决方案.)
我发现了一些文章,告诉我如何使用WM_CLOSE消息,但从来没有我的应用程序是必须处理WM_CLOSE消息的人.
有没有办法挂钩WM_CLOSE并处理它?因为WM_CLOSE只关闭托盘图标但不终止进程本身...
问候,
在尝试将一些代码从java移植到c#时,我遇到了一些麻烦.
首先,对java代码背后的关键概念进行一些解释:现有代码的关键概念是在外部库中导入/使用方法的类.该类实现了一个接口,该接口声明了外部库中的大多数方法.好处是能够创建像这样的实例
Interface1 instance = new classImplementingInterface1();
我正在尝试移植实现接口的代码并从外部库导入方法.实际上我必须将该接口转换为抽象类,因为java接口使用包含预定义值的字段,这在.NET接口中是不受支持的.
这可能是我的注意点:
public abstract class abstractClassA
{
public abstract int abstractMethodA(int parameter);
}
public class usualClass : abstractClassA
{
[DllImort("ExternalLib.dll")]
public static extern abstractMethodA(int parameter);
}
Run Code Online (Sandbox Code Playgroud)
抽象类用于通过键入能够从实现该抽象类的类创建实例
abstractClassA instance = new usualClass();
Run Code Online (Sandbox Code Playgroud)
好吧,这就是我想要做的,但我发现这不起作用,而我继承了一个抽象类,我将不得不使用override语句来实现我想要实现的方法
public class usualClass : abstractClassA
{
public extern override abstractMethodA(int parameter);
}
Run Code Online (Sandbox Code Playgroud)
这不会与DllImport语句结合使用,因为它告诉我使用该语句的方法应声明两者:extern和static.添加override关键字以实现抽象类是不可能的,因为静态成员不能声明为override.所以我想我是如何处理的:/
但实际上我想创建一个类来命名外部库的入口点.但我希望这个类实现一个接口/抽象类,以便能够通过键入来创建实现此接口/抽象类的类的实例
abstractClassA instance = new usualClass();
Run Code Online (Sandbox Code Playgroud)
我也尝试使用接口(但没有烦人的静态预定义字段),我发现接口实现也不能与DllImport语句结合使用,编译器说命名方法是静态的,因此无法实现接口方法.这实际上是有道理的,但对我的问题没有可解决的解决方案.
您是否有过这方面的经验或更好的想法?
我创建了一个WiX安装程序,为Windows 2010部署了一个添加.目标系统目前安装了x64 Win&Office.我走过几个微软网站告诉我,我需要的不仅仅是x64安装程序和运行时(因为加载加载到当前运行的单词的过程中).此安装程序使用以下语句检查VSTO Runtime是否存在:
<?if $(var.Platform)=x64 ?>
<?define win64Flag = "yes"?>
<?else ?>
<?define win64Flag = "no"?>
<?endif ?>
<Property Id="VSTORUNTIMEREDIST">
<RegistrySearch Id="VSTORuntimeRedist" Root="HKLM" Key="SOFTWARE\Microsoft\vsto runtime setup\v4R\VSTORFeature_CLR40" Name="Version" Type="raw" Win64="$(var.win64Flag)"/>
</Property>
<Property Id="OFFICERUNTIME">
<RegistrySearch Id="OfficeRuntime" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4" Name="Version" Type="raw" Win64="$(var.win64Flag)"/>
</Property>
<Condition Message="The Visual Studio 2010 Tools for Office Runtime is not installed. Please install the Office Runtime.">
<![CDATA[Installed OR VSTORUNTIMEREDIST>="10.0.30319" OR OFFICERUNTIME>="10.0.21022"]]>
</Condition>
Run Code Online (Sandbox Code Playgroud)
实际上它适用于我的安装程序的x86版本,但是在x64模式下构建,它无法在注册表中随时找到x64条目(即使安装了运行时).我已经尝试卸载并重新安装运行时(重新启动)但它不起作用.
我也删除了检查以安装我的Add In,但它没有加载然后实际上.
因此我的问题是,如果有任何已知的错误问题或我使用了错误的注册表项?
我正在尝试使用以下代码将 XLIFF 文件转换回正确的 xml 文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//body">
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
<file source-language="en-US" datatype="plaintext" target-language="de">
<body>
<xsl:for-each select="//trans-unit">
<xsl:element name="string">
<xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
<xsl:value-of select="target"/>
</xsl:element>
</xsl:for-each>
</body>
</file>
</xliff>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
但它作为返回得到的只是包含在<source>and<target>标签中的字符串。我正在做一些非常错误的事情,或者我错过了一些特殊的标签?
我能够使用简单的 XSLT 脚本成功创建 XLIFF 文件,但我正在努力将其转换回来。
任何想法表示赞赏。
问候, 托马斯
这是 xliff 文件的示例
<?xml version='1.0' encoding='utf-8'?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
<file source-language="en" datatype="plaintext" target-language="de">
<body>
<trans-unit xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:space="preserve" approved="yes" id="firstrun_textview_language_array_names1">
<source>English</source>
<target>Englisch</target>
</trans-unit>
<trans-unit xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:space="preserve" approved="no" id="firstrun_textview_language_array_names2">
<source>Chinese (traditional)</source>
<target>i …Run Code Online (Sandbox Code Playgroud)