是否可以检查当前已经与您自己正在运行的应用程序进程分开运行的 .NET 应用程序的强名称?
编辑:为澄清起见,不需要硬编码路径到执行程序集的解决方案将是最理想的解决方案。
编辑#2:有什么方法可以在不使用反射的情况下做到这一点?
是否可以检查当前已经与您自己正在运行的应用程序进程分开运行的 .NET 应用程序的强名称?
编辑:为澄清起见,不需要硬编码路径到执行程序集的解决方案将是最理想的解决方案。
编辑#2:有什么方法可以在不使用反射的情况下做到这一点?
没有反射:
如果你知道这个过程,你就知道文件名。如果您知道文件名,则可以处理 PE 标头以查找强名称签名。
这是否为您提供了您正在寻找的东西?
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist)
{
string strongName = "N/A";
try
{
strongName = Assembly.ReflectionOnlyLoadFrom(theprocess.MainModule.FileName).FullName;
}
catch
{
// System process?
}
Console.WriteLine("Process: {0} ID: {1} Strong Name: {2}", theprocess.ProcessName, theprocess.Id, strongName);
}
那应该工作:
public static bool IsStrongNamed(string assemblyPath)
{
try
{
Assembly a = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
byte[] publicKey = a.GetName().GetPublicKey();
return publicKey.Length > 0;
}
catch { return false; }
}
public static bool GetStrongName(string assemblyPath)
{
try
{
Assembly a = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
return a.FullName;
}
catch { return string.Empty; }
}
嗯,我认为您的问题的解决方案是 AssemblyName 类。
第一的
Process.GetProcesses().Where(p => p.ProcessName = nameUWant); //maybe single or default?
然后在每个进程中使用 Process.Modules 来获取该进程加载的 dll 或 exe。在你获得你想要的名字之后。(模块具有名称属性)。然后使用
AssemblyName.GetAssemblyName().GetPublicKeyToken() != null
这应该有效。希望能帮助到你
如果“强名称”是指 exe 名称:
using System.Diagnostics;
if (Process.GetProcessesByName("whatever.exe").Length > 0)
{
//do something
}