Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 验证正在运行的程序集的强名称_.net_Validation_Strongname - Fatal编程技术网

.net 验证正在运行的程序集的强名称

.net 验证正在运行的程序集的强名称,.net,validation,strongname,.net,Validation,Strongname,是否可以检查当前已与您自己运行的应用程序进程分开运行的.NET应用程序的强名称 编辑:为了澄清,不需要执行程序集的硬编码路径的解决方案将是最理想的解决方案 编辑#2:有没有办法在不使用反射的情况下执行此操作?如果“强名称”是指exe名称: using System.Diagnostics; if (Process.GetProcessesByName("whatever.exe").Length > 0) { //do something } 这能给你你想要的吗

是否可以检查当前已与您自己运行的应用程序进程分开运行的.NET应用程序的强名称


编辑:为了澄清,不需要执行程序集的硬编码路径的解决方案将是最理想的解决方案


编辑#2:有没有办法在不使用反射的情况下执行此操作?

如果“强名称”是指exe名称:

using System.Diagnostics;

if (Process.GetProcessesByName("whatever.exe").Length > 0)
{
     //do something

}

这能给你你想要的吗

    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.Modules,以获取此进程加载的DLL或EXE。 在你获得你想要的名字之后。(模块具有name属性)。 然后使用

AssemblyName.GetAssemblyName().GetPublicKeyToken() != null
这应该行得通。
希望它有助于

strong名称作为申请标题?我想你可以。因为您不想更改正在运行的文件中的某些内容。查看不会干扰正在运行的应用程序的进程。您到底想做什么。检查特定进程是否具有强名称?获取特定进程的EntryAssembly的全名?您不想硬编码程序集路径,但您是否有要检查的进程的进程名称或进程id?您知道一种不进行反射的方法吗?我不知道其他方法可以做到这一点。+1并被接受,因为我暂时将其用作解决方案。谢谢。你知道一种不用思考的方法吗?你是说不用思考吗?你为什么不想用这个?它允许您检查程序集,而无需在流程中真正加载程序集。不幸的是,它仍然会锁定流程的文件。然后您可以使用带有PE头的andras解决方案,但是,在这种情况下,只需将dll复制到本地文件夹中,然后使用ReflectionOnlyLoad可能会更容易。对于从进程句柄获取文件名:+1,我不接受这一点,因为我只能在稍后阶段使用它(如果有的话),但感谢您的帮助。
AssemblyName.GetAssemblyName().GetPublicKeyToken() != null