我之前也遇到过类似的问题。我正在创建一个应用程序,我只想运行一个实例。然后我创建了一个
这就是我将如何解决它。
我创建了一个 WCF 管道服务:
[ServiceContract]
interface DNRIService
{
[OperationContract]
void OpenDnt(string path);
[OperationContract]
void OpenPak(string path);
[OperationContract]
bool IsOnline();
[OperationContract]
void Activate();
}
然后我这样做了:
public Main(String [] args) : this()
{
try
{
using (ChannelFactory<DNRIService> serviceFactory = new ChannelFactory<DNRIService>(new NetNamedPipeBinding(), new EndpointAddress(PipeService)))
{
var channel = serviceFactory.CreateChannel();
if(channel.IsOnline())
{
foreach (var argument in args)
{
var argTrim = argument.Trim() ;
if (argTrim.EndsWith(".dnt"))
channel.OpenDnt(argument);
else if (argTrim.EndsWith(".pak"))
channel.OpenPak(argument);
}
channel.Activate();
Close();
}
}
}
catch
{
@this = new ServiceHost(this, new Uri(PipeName));
@this.AddServiceEndpoint(typeof(DNRIService), new NetNamedPipeBinding(), PipeService);
@this.BeginOpen((IAsyncResult ar) => @this.EndOpen(ar), null);
foreach (var argument in args)
{
var argTrim = argument.Trim();
if (argTrim.EndsWith(".dnt"))
OpenDnt(argument);
else if (argTrim.EndsWith(".pak"))
OpenPak(argument);
}
}
}
请注意,它会尝试使用相同的名称打开。如果它不能,那么它会关闭并假设另一个已经打开。然后它会尝试将其参数发送给原始的。
只需稍作修改即可获取当前用户。
这个问题应该可以帮助您:
How do I get the current username in .NET using C#?
其余的由你来实现。如果您想查看我在此处发布的完整代码:
https://github.com/Aelphaeis/Dragon-Nest-Resource-Inspector
(运行它会让您了解它在只允许单个实例的情况下是如何工作的)。