最近,我决定将我的一个用 C# 编写并针对.NET Framework 4.5 的 WPF Windows 桌面应用程序迁移到最新的.NET Core 3.1。一切都很好,直到我必须添加对单实例应用程序的支持,同时能够将任何参数从第二个实例传递到第一个运行实例。我之前针对单实例应用程序的 WPF 实现是使用System.Runtime.Remoting,这在 .NET Core 中不可用。因此我必须做一些新的事情。下面是我想出的实现。它工作得很好,但我觉得它可以改进。请随意讨论和改进建议的解决方案。
我创建了一个 SingleInstanceService,它使用信号量来指示它是否是第一个实例。如果它是第一个实例,我将创建一个 TcpListener 并无限期地等待从第二个实例传递的任何参数。如果启动了第二个实例,则我将第二个实例的参数发送到第一个侦听实例,然后退出第二个实例。
internal class SingleInstanceService
{
internal Action<string[]> OnArgumentsReceived;
internal bool IsFirstInstance()
{
if (Semaphore.TryOpenExisting(semaphoreName, out semaphore))
{
Task.Run(() => { SendArguments(); Environment.Exit(0); });
return false;
}
else
{
semaphore = new Semaphore(0, 1, semaphoreName);
Task.Run(() => ListenForArguments());
return true;
}
}
private void ListenForArguments()
{
TcpListener tcpListener = new TcpListener(IPAddress.Parse(localHost), localPort);
try
{
tcpListener.Start();
while …Run Code Online (Sandbox Code Playgroud) 我正在使用VS2010中的.NET Framework 4.0开发一个C#应用程序.它是许可的.我已经从DreamSpark下载了VS2010,因为我是一名学生.但是,在调试我的应用程序时,myapp.vshost.exe尝试连接到各种远程IP地址.他们之中有一些是:
194.7.155.82, 199.7.59.190
Run Code Online (Sandbox Code Playgroud)
此外,当我在发布模式下编译我的应用程序并使用它时,我的防火墙弹出我的应用程序尝试连接到不同的IP地址.我的应用程序不需要任何互联网连接.但是,它试图连接.
请告诉我如何阻止这种行为?
这些是我项目的参考:
Interop.IWshRuntimeLibrary
Interop.NetFwTypeLib
System.dll
System.Management.dll
System.ServiceModel.dll
System.ServiceProcess.dll
Run Code Online (Sandbox Code Playgroud)
他们都来自微软并签名.我不使用任何第三方库.我还将此添加到我的app.config文件中:
<?xml version="1.0"?>
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)