枚举程序集的所有已安装版本(在 GAC 中)

2024-04-06

是否可以使用 C# 枚举 GAC 中程序集的所有已安装版本?例如,我有一个名为“My.Assembly”的程序集。该程序集可能有各种版本(“1.0.0.0”、“2.3.4.5”、“0.1.2.4”等),并且可以针对各种平台(x86、x64、任何 CPU)进行编译。

现在我需要一种方法来确定安装了哪些版本/平台。

我知道我可以枚举 GAC 中的目录,但这似乎是错误的。应该有更好的方法来做到这一点。

背景我有一个启动器应用程序,用户在其中选择一个 DLL。启动程序从 DLL 中检索一些信息(不加载它),然后必须启动处理 DLL 的正确托管 C# 应用程序。 DLL 可以针对 Win32 或 x64 进行编译,并始终公开相同的(独立于平台的)接口。我使用 LoadLibrary 函数在 C# 应用程序中加载 DLL。唯一的问题是进程必须具有匹配的格式(x86 或 x64)。 C# 应用程序可以而且应该针对 x86、x64 和任何 CPU 进行编译。


Using a 托管包装器 http://blogs.msdn.com/b/junfeng/archive/2004/09/14/229649.aspx为了非托管融合 API http://msdn.microsoft.com/en-us/library/ms404523.aspxa 能够准确地完成我想做的事情:

class Program
{

    static IEnumerable<AssemblyName> GetInstalledVersions(string name)
    {
        int result;

        IAssemblyName assemblyName;
        result = Utils.CreateAssemblyNameObject(out assemblyName, name, CreateAssemblyNameObjectFlags.CANOF_DEFAULT, IntPtr.Zero);
        if ((result != 0) || (assemblyName == null))
            throw new Exception("CreateAssemblyNameObject failed.");

        IAssemblyEnum enumerator;
        result = Utils.CreateAssemblyEnum(out enumerator, IntPtr.Zero, assemblyName, AssemblyCacheFlags.GAC, IntPtr.Zero);
        if ((result != 0) || (enumerator == null))
            throw new Exception("CreateAssemblyEnum failed.");

        while ((enumerator.GetNextAssembly(IntPtr.Zero, out assemblyName, 0) == 0) && (assemblyName != null))
        {
            StringBuilder displayName = new StringBuilder(1024);
            int displayNameLength = displayName.Capacity;
            assemblyName.GetDisplayName(displayName, ref displayNameLength, (int)AssemblyNameDisplayFlags.ALL);
            yield return new AssemblyName(displayName.ToString());
        }

    }

    static void Main(string[] args)
    {
        foreach (AssemblyName assemblyName in GetInstalledVersions("System.Data"))
            Console.WriteLine("{0} V{1}, {2}", 
                assemblyName.Name, assemblyName.Version.ToString(), assemblyName.ProcessorArchitecture);
    }
}

运行上面的程序给出以下输出:

System.Data V2.0.0.0, Amd64
System.Data V2.0.0.0, X86
System.Data V4.0.0.0, Amd64
System.Data V4.0.0.0, X86

感谢汉斯·帕桑特为我指明了正确的方向!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

枚举程序集的所有已安装版本(在 GAC 中) 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • mfence 和 asm 易失性 ("" : : : "内存") 的区别

    据我了解 mfence是硬件内存屏障 而asm volatile memory 是编译器障碍 但是 可以asm volatile memory 用来代替 mfence 我感到困惑的原因是这个链接 http gcc gnu org ml gc
  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 将具有不同格式的文本文件读取到 MATLAB

    我有一个文本文件 但不幸的是它的格式很差 但是我想将文本文件的内容读入矩阵 但我不知道该怎么做 当尝试使用fscanf textscan textread其余的它只是将所有内容复制到一个单元格中 但我不希望那样 内容如下 所以我只想读取小数
  • Rake:记录任何正在执行的任务

    如何在不更改任务源的情况下为每个 rake 任务创建数据库日志记录 我需要存储日期时间 任务名称 参数 有某种观察者等吗 您可以覆盖Rake Task invoke中的方法application rb application rb modu
  • 使用错误:未找到行魔术函数“%sql”

    reload ext sql sql sqlite 第二行无法编译 报告显示 UsageError Line magic function sql未找到 用Python3 8 jupyter笔记本 我使用 conda 安装 ipython
  • 测量库调用和回调之间的时间

    你好 在 iPhone 应用程序中 我使用一个库 C 它在计算完成时异步进行回调 现在我想测量在进行回调之前所花费的时间 包括调用库的方法 是否有可能使用 Apple 的 Instruments 应用程序来做到这一点 最佳实践是什么 过去
  • C++ 跨文件引用变量

    我有一个项目 需要在另一个 CPP 文件中引用一个 CPP 文件中声明的变量 这可能吗 如果是这样 怎么办 如果您将其声明为全局 顶级 位于任何函数定义之上 并使用 extern 这是可能的放在其他文件中以使编译器知道 Main cpp i
  • Ruby Mongodb 驱动程序 $gt 在日期条件下充当 $gte,为什么?

    我有一个奇怪的情况 gt and gteruby mongodb 驱动程序中的条件 所以这是代码 timeline timeline db find date gt gt s time username in gt followers ar
  • 如何在 Perl 中替换现有文件中的字符串

    我想在名为 1 classification dat 2 classification dat 等的所有文本文件中将 蓝色 一词替换为 红色 我想编辑同一个文件 所以我尝试了以下代码 但它不起作用 我哪里出错了 files glob cla
  • 使用python更改Windows快捷方式.lnk文件的图标

    我想更改a的图标 lnk我创建后的文件 到目前为止 这是我的主要代码 import win32com client shell win32com client Dispatch WScript Shell shortcut shell Cr
  • 如何使用 Python 3.4.2 在 Windows 7 中安装 scipy

    我安装时遇到问题scipy 当我跑步时 python m pip install scipy 我收到以下消息 C Python34 lib site packages pip main py run on 01 14 15 15 56 16
  • 如何检测flutter webview中内部html何时发生变化

    我在用着webview flutter https pub dev packages webview flutter要从 Flutter 应用程序上的 URL 查看页面 我需要做的是检测 HTML 代码中何时发生更改 而不更改 URL 因为
  • 在 Swift 中的一处导入整个项目的框架?

    我自己做了一个Cocoa Touch Framework 并且我只想将其导入到代码中的一处 在 Xcode Objective C 的早期版本中 有一个中心位置位于Supporting Files 它如何适用于基于 Swift 的项目 创建
  • 将 JSON 查询条件转换为 MongoDB/Mongoose 操作

    我正在客户端使用 Angular 8 构建一个应用程序 在服务器端使用 NodeJS 12 和 MongoDB 4 Mongoose 5 构建一个应用程序 我有一个由以下生成的查询角度查询构建器模块 https www npmjs com
  • 对列表中的 Erlang 记录进行排序?

    我在erlang中有一条记录 record myrec id 0 price 0 quantity 0 然后 我有一个记录列表 我想按 id 和价格按降序和升序排序 其中价格是第一个键 如果两个记录具有相同的价格 我想按 id 对它们进行排
  • 声明一个元素数量为 0 的数组仍然可以存储值

    我知道使用负索引纯粹是运气 但出于好奇我尝试了这个 我知道你可以声明 array 0 就像 malloc 0 一样 是合法的 但是我为什么可以在 array 0 中存储一个值呢 include
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 有人能帮我解决这个问题吗 Error error type OAuthException code 400 error
  • 跳出嵌套循环

    如果我有一个嵌套在另一个循环中的 for 循环 我怎样才能以最快的方式有效地退出两个循环 内部和外部 我不想使用布尔值 然后不得不说转到另一个方法 而只是执行外循环之后的第一行代码 有什么快速又好的方法可以解决这个问题 我认为异常并不便宜
  • 如何在 Visual Basic 2012 中对日期使用 BindingSource.Filter?

    我正在尝试过滤我的数据库以显示从我表单上的日历中选择的日期的所有预订 这是我写的代码 Public selDate As DateTime Dim response As Integer Public Sub FilterBooking s
  • Angularjs jquery UI 自动完成

    我正在尝试在 Angular 指令中实现 jquery 的自动完成功能 我收到的源数据来自 websocket 响应 它不起作用 我认为响应延迟导致了这里的问题 如果有人能解释下面的代码 我将不胜感激 是否有任何优雅的技术可以使用某种请求
  • 创建新的 django 项目时出现 Pydev 错误

    每次我使用钛 eclipse 和 pydev 创建一个新的 django 项目时 我都会收到此错误 实际上 它确实创建了文件settings py 我想知道是什么导致了这个错误以及如何修复它 这实际上是 Django 1 4 的 PyDev
  • 枚举程序集的所有已安装版本(在 GAC 中)

    是否可以使用 C 枚举 GAC 中程序集的所有已安装版本 例如 我有一个名为 My Assembly 的程序集 该程序集可能有各种版本 1 0 0 0 2 3 4 5 0 1 2 4 等 并且可以针对各种平台 x86 x64 任何 CPU