从卸载的可执行文件中获取程序集属性

时间:2021-03-11 22:37:04

标签: c# .net wpf

我试图从可执行文件中检索典型的 AssemblyInfo 属性,但不是从当前正在执行的程序集中检索。我希望“查看”我用 C#.NET 编写的驱动器上其他地方的程序文件 (.exe) 并检查 AssemblyProduct 字符串。

当您从当前正在执行的程序集中查找此信息时,这是相当简单和直接的。但是,当您尝试从 卸载 程序集中提取它时,显然没有那么多。

当我使用以下代码时,它返回“Microsoft® .NE​​T Framework”,而不是我放入我的 AssemblyInfo.cs 文件中的产品名称。

注意:我使用 System.Reflection.AssemblyName 对象来提取版本信息,例如:AssemblyName.GetAssemblyName(pathToAssembly) 并且这可以正常工作,但是我无法使用它来提取我的程序集的属性类或到目前为止我已经尝试过的任何方式。是否还有其他特殊课程,或者我在这里遗漏了什么或做错了什么?

    public static string GetAppProdIDFromPath(string pathToForeignAssembly)
    {
        var atts = GetForeignAssemblyAttributes(pathToForeignAssembly);
        var id = string.Empty;
        foreach (var att in atts)
        {
            if (att.GetType() == typeof(AssemblyProductAttribute))
            {
                id = ((AssemblyProductAttribute)att).Product;
            }
        }

        return id;
    }
    
    private static object[] GetForeignAssemblyAttributes(string pathToAssembly)
    {
        if(File.Exists(pathToAssembly))
        {
            try
            {
                var assm = System.Reflection.Assembly.LoadFrom(pathToAssembly);
                return assm.GetType().Assembly.GetCustomAttributes(false);
            }
            catch(Exception ex)
            {
                // logger etc
            }
        }
        else
        {
            throw...
        }

        return null;
    }

1 个答案:

答案 0 :(得分:0)

正如 Duncanp 所提到的,我的代码中有一个错误。为清楚起见并为寻找相同解决方案的任何人发布它:

public static string GetAppProdIDFromPath(string pathToForeignAssembly)
{
    var atts = GetForeignAssemblyAttributes(pathToForeignAssembly);
    var id = string.Empty;
    foreach (var att in atts)
    {
        if (att.GetType() == typeof(AssemblyProductAttribute))
        {
            id = ((AssemblyProductAttribute)att).Product;
        }
    }

    return id;
}

private static object[] GetForeignAssemblyAttributes(string pathToAssembly)
{
    if(File.Exists(pathToAssembly))
    {
        try
        {
            var assm = System.Reflection.Assembly.LoadFrom(pathToAssembly);
            return assm.GetCustomAttributes(false); // fixed line
        }
        catch(Exception ex)
        {
            // logger etc
        }
    }
    else
    {
        throw...
    }

    return null;
}