RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 594211
Accepted
user2455111
user2455111
Asked:2020-11-22 14:53:51 +0000 UTC2020-11-22 14:53:51 +0000 UTC 2020-11-22 14:53:51 +0000 UTC

在不加载构建的情况下找出构建的运行时版本

  • 772

我需要显示所有程序集的列表GAC,以及它们的RuntimeVersion. 如果你这样做:

Assembly.ReflectionOnlyLoadFrom(systemAssemblyModel.Path).ImageRuntimeVersion;

然后内存被额外的 80 MB 堵塞,不清楚如何清除它们。如果您完全下载程序集,然后将其与域一起卸载。发生这种情况OutOfMemoryException:

internal class Program
{    
   static void Main(string[] args)
   {
       var appDomain = AppDomain.CreateDomain("TestDomain");    
       appDomain.DoCallBack(() => LoadModule());    
       var worker = (Worker) appDomain.CreateInstanceAndUnwrap(typeof (Worker).Assembly.FullName, typeof (Worker).FullName);
       var a1 = worker.GetAssembliesFullName();

       foreach (var assemblyFullName1 in a1)
       {
           Console.WriteLine(assemblyFullName1);
       }
       Console.WriteLine();
       var a2 = AppDomain.CurrentDomain.GetAssemblies();
       foreach (var assembly1 in a2)
       {
           Console.WriteLine(assembly1.FullName);
       }
            AppDomain.Unload(appDomain);

       Console.ReadKey();
    }

    private static void LoadModule()
    {   
        foreach (var systemAssemblyModel in AssemblyLoader.LoadAssemblies())
        {
            try
            {
               var version = Assembly.Load(systemAssemblyModel.Desc.Path).ImageRuntimeVersion;
            }
            catch (Exception)
            {

            }
        }
     }    
}

class Worker : MarshalByRefObject
{
    public string[] GetAssembliesFullName()
    {
         return AppDomain.CurrentDomain.GetAssemblies().Select(a => a.FullName).ToArray();
    }
}
c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    user2455111
    2020-11-22T16:53:28Z2020-11-22T16:53:28Z

    也许有人会派上用场。通过建议

    Mono.Cecil包会帮助你– Pavel Mayorov

    连接库并使用以下代码

    AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(assemblyDescription.Path);
    Console.WriteLine(assemblyDescription.Name + " " + assembly.MainModule.RuntimeVersion);
    
    • 4
  2. BlackWitcher
    2020-11-22T17:16:47Z2020-11-22T17:16:47Z

    它在不使用添加的情况下对我有用。库,但只能得到像 1.0.5.124 这样的版本:

        /// <summary>
        /// Без выполнения загрузки файла в память (актуально для сборок) возвращает версию файла Filename в переменную 
        /// типа Version если файл существует и возможно получение номера версии.
        /// Если файл не существует — возвращает null.
        /// Если номер версии не удается получить для файла, то все поля результата будут нулевыми (0.0.0.0).
        /// Если имя файла не указано, то возвращает сведения для выполняемой сборки.
        /// </summary>
        /// <param name="Filename">путь к файлу для вычисления версии.</param>
        /// <remarks>Правильнее и надежнее использовать метод GetFileVersionInfo.</remarks>
        public static Version GetFileVersion(string Filename = "")
        {
            if (string.IsNullOrEmpty(Filename)) { Filename = Assembly.GetExecutingAssembly().Location; }
            if (!File.Exists(Filename)) { return null; }
            Version version = new Version();
            try
            {
                FileVersionInfo vi = FileVersionInfo.GetVersionInfo(Filename);
                version = new Version(vi.ProductVersion);
            }
            catch (ArgumentNullException)
            {
                //Не можем определить версию файла, и, перемнную для обработки ошибки не ловим, т.к. 
                //её не обрабатываем, а делаем вид, что у файла нулевая версия.
                version = new Version(0, 0, 0, 0);
            }
            return version;
        }
    

    这是一个返回更多信息的简单方法:

        /// <summary>
        /// Возвращает сведения о версии и параметрах файла в переменную класса FileVersionInfo без загрузки файла 
        /// в память (не блокирует файл).
        /// Если файл не существует, то возвращает null.
        /// Если имя файла не указано, то возвращает сведения для выполняемой сборки.
        /// </summary>
        /// <param name="Filename">Имя файла для получения сведений о версии.</param>
        /// <remarks>
        /// Если получить версию файла невозможно (например, для файлов, отличных от EXE и DLL), то возвращает 
        /// практически пустую структуру класса FileVersionInfo БЕЗ генерации ошибки.
        /// </remarks>
        public static FileVersionInfo GetFileVersionInfo(string Filename = "")
        {
            if (string.IsNullOrEmpty(Filename)) { Filename = Assembly.GetExecutingAssembly().Location; }
            if (!File.Exists(Filename)) { return null; }
            return FileVersionInfo.GetVersionInfo(Filename);
        }
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5