首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从动态生成的程序集中引用GAC程序集?

从动态生成的程序集中引用GAC程序集需要以下步骤:

  1. 创建一个新的程序集:
代码语言:csharp
复制
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
    new AssemblyName("MyDynamicAssembly"),
    AssemblyBuilderAccess.RunAndSave);
  1. 创建一个模块:
代码语言:csharp
复制
ModuleBuilder mb = ab.DefineDynamicModule("MyDynamicModule", "MyDynamicAssembly.dll");
  1. 创建一个类型:
代码语言:csharp
复制
TypeBuilder tb = mb.DefineType("MyDynamicType", TypeAttributes.Public);
  1. 创建一个方法:
代码语言:csharp
复制
MethodBuilder methBuilder = tb.DefineMethod("MyDynamicMethod",
    MethodAttributes.Public | MethodAttributes.Static,
    typeof(void),
    Type.EmptyTypes);
  1. 使用ILGenerator生成方法体:
代码语言:csharp
复制
ILGenerator il = methBuilder.GetILGenerator();
  1. 在ILGenerator中,使用Emit方法引用GAC程序集中的类型:
代码语言:csharp
复制
Type gacType = Type.GetType("GacAssembly.MyNamespace.MyType, GacAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=<your_public_key_token>");
il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Call, gacType.GetMethod("MyMethod"));
il.Emit(OpCodes.Ret);
  1. 完成类型和程序集的定义:
代码语言:csharp
复制
Type dynamicType = tb.CreateType();
ab.Save("MyDynamicAssembly.dll");
  1. 最后,在你的应用程序中引用生成的程序集,并调用MyDynamicMethod方法:
代码语言:csharp
复制
Assembly.LoadFrom("MyDynamicAssembly.dll").GetType("MyDynamicType").GetMethod("MyDynamicMethod").Invoke(null, null);

这样,你就可以从动态生成的程序集中引用GAC程序集了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集的引用关系

    本文将告诉大家如何在 IIncrementalGenerator 增量 Source Generator 生成代码里面,在 Roslyn 分析器里面判断两个程序集是否存在引用关系 先上核心代码实现,核心代码就是调用以下代码进行判断程序集的引用关系...else { // 没有访问过的,获取引用的程序集是否存在引用关系...Modules 从而获取到 ReferencedAssemblySymbols 也就是当前程序集所引用的所有程序集,再判断引用的程序集里面是否包含期望被引用的程序集 对于间接引用的程序集来说,需要进行遍历才可以判断到...,但是此时需要处理程序集循环引用问题。...本文这里采用传入一个字典的方法解决这个问题 获取当前分析器所分析的项目的引用程序集,可以通过 Compilation 的 SourceModule 的 ReferencedAssemblySymbols

    19010

    IIncrementalGenerator 增量 Source Generator 生成代码入门 获取引用程序集的所有类型

    本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何获取到当前正在分析的程序集所引用的所有的程序集,以及引用的程序集里面的所有类型...这项技术可以用在生成导出类型相关的需求上,比如我想导出我当前程序集里面所有引用的程序集的继承于 IFoo 接口的所有类型,即可采用本文介绍的方法 核心逻辑是在 Compilation 里面拿到 SourceModule...属性 这里的 ReferencedAssemblySymbols 属性就是当前的程序集所引用的程序集了 在这些程序集上枚举所有程序集内的语义类型即可获取到所有的类型 以下是详细的例子 为了方便描述本文的技术实现...就是引用的 Lib 程序集里面的所有类型。...为了测试咱的分析器代码是否正确,可以尝试将收集到的 Lib 程序集里面的所有类型的记录输出作为一个源代码生成 public void Initialize(IncrementalGeneratorInitializationContext

    31620

    WiX安装选项--注册程序集到GAC和VS的设计时环境

    Visual Studio的设计时引用组件的窗口中看到的程序集的位置和程序集的运行时位置是不一样的,特别是在全局程序集缓存(GAC)中的程序集,通过WiX制作Winodws安装程序的时候需要处理这个区别...VS的设计时的添加引用窗口看到的程序集的位置来自注册表SOFTWARE\Microsoft\.NETFramework\AssemblyFolders – 放在HKEY_LOCAL_MACHINE 下面就是针对所有的用户...WiX要把一个程序注册到GAC,只需要在File 上增加一个选项 Assembly=".net" 就可以了,但是注册到GAC的dll不会放到安装目录下方了,这就需要通过提供两个Component方式来处理..." Name="GAC"> GAC --> <File Id="F_RT_GACTEST" LongName="GACTest.dll" Source=

    69060

    C#的动态加载和使用程序集

    本文将深入探讨C#中的动态加载和使用程序集,包括它们的基本概念、实现方式、高级用法和最佳实践。 1....动态加载程序集的基本概念 1.1 什么是动态加载 动态加载是指在应用程序运行时,根据需要加载程序集的过程。这与静态加载(在编译时确定)相对。...1.2 动态加载的优势 灵活性:可以在运行时根据条件加载不同的程序集。 扩展性:可以轻松添加新的功能模块。 隔离性:各个程序集之间相互隔离,便于管理和维护。 2....动态加载程序集的高级特性 4.1 处理依赖关系 动态加载的程序集可能依赖其他程序集,需要确保这些依赖项也被加载。...最佳实践 5.1 错误处理 在动态加载程序集时,应该处理可能出现的错误,如程序集不存在或类型找不到。 5.2 安全性 加载未知的程序集可能带来安全风险,应该确保来源的安全性。

    2.3K00

    .NET面试题系列 - .NET框架基础知识(2)

    它们向公共语言运行时提供了解类型实现所需要的信息。可以将程序集看成是构成逻辑功能单元并为一起工作而生成的类型和资源的集合。...如果你打算将类库部署到GAC,一般来说,这个库应当被大量其他工程引用。 不能把可执行的程序集部署到GAC。...问:也就是说你可以把VS帮你引用的所有参考都删了? 答:是。这个程序只需要基础类库。 问:那你都删了之后,Console类型从哪里来? 答:从mscorlib.dll里来。...答:因为它在GAC里,每次自动引用。 问:如果我用VS编程,运行程序(非调试模式),会发生什么? 答:VS会先用C#编译器将源代码编译为一个程序集。程序集包括IL代码。...因为源代码没问题,所以编译成功,之后,CLR引用程序集中所有需要的其他程序集(这个例子就是没有其他程序集),进行运行时检查,检查也没问题,就开始调用JIT进行即时编译。将IL转换为机器码。

    1.3K20

    C# Assembly

    强烈建议每次生成程序集时都更改版本号,确保每个版本都有自己的唯一性标识,确保LoadFrom方法的行为符合预期。...用法:通常用于在运行时加载程序集,适用于大多数动态加载需求。 返回值:返回一个Assembly对象,表示已加载的程序集的引用。 限制:无法跨应用程序域加载程序集,仅限于当前AppDomain。...CLR不提供卸载单独程序集的能力。如果 CLR 允许这样做,那么一旦线程从某个方法返回至已卸载的一个程序集中的代码,应用程序就会崩溃。...但CLR 一样不允许卸载用这两个方法加载的程序集。因为用这两个方法加载了程序集之后,仍然可以利用反射来创建对象,以便引用这些程序集中定义的元数据。如果卸载程序集,就必须通过某种方式使这些对象失效。...应该利用以下两种技权一开发应用程序来动态发现和构造类型实例。 让类型从编译时已知的基类型派生。在运行时构造派生类型的实例,将对它的引用放到基类型的变量中(利用转型),再调用基类型定义的虚方法。

    8010

    怎样反射程序集?

    2)、程序集可以封装一些代码,只提供必要的访问接口。 6、如何添加程序集的引用?...1)、添加路径、项目引用、GAC(全局程序集缓存) 不能循环添加引用 在c#中添加其他语言编写的dll文件的引用。...动态连接库(=dynamic link library) GAC的详细配置参考:http://support.microsoft.com/kb/815808/zh-cn GAC目录C:\WINDOWS...\assembly 数字签名(防止引用的程序集被篡改) 我们调用的类都是位于各个程序集中,如果调用的类在没有引用的程序集中,则需要添加对那个程序集的引用,比如ConfigurationManager。...还有反编译工具也是通过反射实现 2、反射就是动态获取程序集的元数据(提供程序集的类型信息)的功能 反射:就是动态获取程序集中的元数据来操作类型的。

    53020

    解决T4模板的程序集引用的五种方案

    如果要了解T4具体的应用,则可以参考我的文章《创建代码生成器可以很简单:如何通过T4模板生成代码?》(上篇)(下篇)。如果你编写T4模板,你不得不面对一个问题——如何引用一个程序集?...目录 一、添加程序集引用解决不了问题 二、将引用程序集安装到GAC 三、利用VS的PublicAssemblies目录 四、指定程序集的具体路径...五、采用环境变量 六、使用VS宏 一、添加程序集引用解决不了问题 如果你的T4模板需要调用一个自定义的类型,并且该类型定义在某个非系统程序集中,你就需要通过T4...没错,这是一种解决方案,如果被引用的程序集具有强签名的话。有一点需要注意的是,T4模板引用某个安装于GAC的程序集的时候,在指令下不能指定文件扩展名(.dll)。...如果被引用的程序集被没有被签名,GAC的方式则不能使用,在这种情况下你需要指定程序集文件所在的位置,最直接的当然就是指定程序集文件的绝对路径。

    83870

    msbuild 使用 ProduceOnlyReferenceAssembly 创建作为引用的仅公开成员程序集

    本文告诉大家如何使用 msbuild 的 ProduceOnlyReferenceAssembly 功能,将某个程序集里面仅导出其中的公开成员定义,而不包含具体的实现的方法 有一些 NuGet 包在发布的时候...可以让输出的程序集 dll 或 exe 里面只是包含了公开的成员的定义,但不包含具体的实现代码。...这样的程序集是仅仅作为被引用的程序集使用的,不能被实际调用 下面来告诉大家如何构建这样的程序集,构建有两个方法,第一个是放在 csproj 项目文件里面。...咱可以通过在构建的时候,修改构建命令来打出仅作为引用的程序集,如执行以下代码 msbuild /p:ProduceOnlyReferenceAssembly=true 此时构建出来的 dll 就是只读程序集...如果不想从源代码生成,期望从 DLL 里面重新导出,请参阅 dotnet 使用 Refasmer 从现有的 DLL 里面导出公开的成员组装出新的仅作为引用用途的程序集 本文会经常更新,请阅读原文

    78020

    关于强命名程序集

    如何部署强命名程序集( Strong Name Assembly )和 GAC    a)GAC 的概念 如果一个 Assembly 要被多个应用程序访问,那么他就必须放在一个...GAC 的作用就是提供给 CLR 一个已知的确定的目录去寻找引用的 程序集。    ...首先, GAC 使得很多程序可以共享程序集,这从整体上减少了使用的物理内存;其次,我们很容易将一个新版的程序集部署到  GAC 中,并通过一种发布者策略(差不多就是一种重定向方法,比如将原来引用版本为...1.0.0.0 程序集的程序,通过更改它的配置文件,转而让程序去引用版本为 2.0.0.0 的程序集)来使用新版本;最后, GAC 还提供了对不同版本程序集的并存( side-by-side...强命名策略: 生成公钥与私钥对,并 对私钥做严格的保护 生成:sn -k keyfile.snk 公钥与私钥对 抽取公钥:sn -p keyfile.snk public.snk 从keyfile中抽取公钥保存到

    64910

    从代码到AI:程序员如何拥抱生成式AI?

    从代码到AI:程序员如何拥抱生成式AI? 近年来,生成式AI的出现彻底改变了程序员的开发方式。无论是代码补全、自动调试,还是代码文档生成,这些曾经费时费力的任务如今在AI的帮助下变得更加高效。...在这篇文章中,我们将探讨生成式AI如何融入程序员的日常开发流程,并分享一些实用建议,帮助你更好地拥抱这场技术革命。 一、生成式AI如何提升开发效率?...生成式AI是一种能够从数据中学习并生成内容的技术,在代码开发领域,它的能力体现在以下几个方面: 代码补全与优化 生成式AI(如GitHub Copilot、Cursor)能够根据上下文提供智能代码补全...无论是前端UI、后端接口还是测试用例,AI都能生成初步代码,帮助快速验证想法。 二、程序员如何快速上手生成式AI工具?...这样的分工不仅能解放生产力,还能让程序员从繁琐的任务中解脱出来,更专注于创造力的发挥。 五、结语 从代码到AI,这场技术变革对程序员既是机遇,也是挑战。

    22910

    使Spring.NET的IOC容器支持动态加载的程序集

    当我们发布系统时,有时候希望不用关掉应用程序就能完成发布,但Spring.NET的ApplicationContext是从AppDomain.CurrentDomain中加载的程序集中创建对象的...,并不支持从动态加载的程序集中创建对象,如果直接把更新后的程序集复制到bin目录,会无法替换dll或导致应用程序重启。...最近我正好有这个需求,就研究了一下Spring的相关代码,需要解决的问题如下: 1.首先要解决如何动态加载程序集 2.其次要找到某种方式告诉Spring在创建对象的时候用我们自己加载进来的程序集 如何动态加载程序集...动态加载程序集,网上最多的说法是另外创建一个AppDomain,然后在新创建的AppDomain里加载程序集。...但这样想想也对,程序集更新后,如果想让对象也重新创建,那对象从本身来讲就不应该是singleton的了。

    70240

    程序员级别鉴定书(.NET面试问答集锦)

    使用 GAC 给我们带来哪些好处? GAC 是指 Global Assembly Cache, 用处是放在这里的程序集可以被多个程序共同调用, .NET 中的大部分程序集都在这里....early-binding: 是指编译的时候绑定,late-binding是指运行时绑定。 Assembly.Load是静态引用还是动态引用? 动态引用。...强名称保护程序集的版本沿袭,因为强名称的唯一性能够确保没有其他人能够生成你的程序集的后续版本。...为了能在多个应用程序调用或共享一组程序集的多个进程之间共享生成的代码,公共语言运行库支持一种提前编译模式。...· 它一次编译一个完整的程序集,而不是一次编译一个方法。 · 它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上。 如何在.NET CLR的分代垃圾收集器管理对象的生命周期?

    1.8K70

    dotnet 使用 Refasmer 从现有的 DLL 里面导出公开的成员组装出新的仅作为引用用途的程序集

    本文告诉大家 Resharper 家(JetBrains)开源的 Refasmer 工具,这个工具的功能就是从现有的 DLL 或 EXE 程序集里面,将所有的公开成员导出,重新打出新的 DLL 或 EXE...此时打出的新的程序集里面的方法都不包含实现,而是只有定义,这样的程序集被成为仅作为引用用途的程序集,也就是 Reference assemblies 的意思,这也就是 Refasmer 命名来源 这个...在 dnspy 上可以看到 refasm.dll 里面只有方法的定义和属性的定义,但是没有任何具体的实现 这样的仅作为引用用途的程序集可以方便用在某些插件开发 SDK 或者某些不支持的版本上,用于构建用途...或者用在某些超大项目上,用于支持超大解决方案里面单个项目的独立构建 和 dotnet 自带的 ProduceOnlyReferenceAssembly 不同之处在于 Refasmer 可以从 DLL 里面导出仅作为引用用途的程序集...创建作为引用的仅公开成员程序集 除了以上默认命令外,还可以给 refasmer 加上以下参数,用于实现更多功能 指定导出文件夹 默认的命令导出的是 refasm.dll 文件,显然这样的文件是不适合作为

    60420

    【翻译】在没有安装ASP.NET MVC3的服务器上运行ASP.NET MVC3的程序-scottgu

    方法1:基于GAC引用ASP.NET MVC组件 当您在计算机上安装ASP.NET MVC 3的时候, 一些组件会自动注册到GAC中(全局程序集缓存)。...GAC提供一个集中的地方供安装和升级(通过Windows更新).NET程序集。 因此ASP.NET MVC3项目默认在这里引用程序集。...: 上述错误表示, 至少有一个运行ASP.NET MVC 3所需的程序集在GAC中找不到。...方法2:基于\ Bin目录中引用ASP.NET MVC组件 您的项目可以使用另一种方法 在您的Web应用程序的\bin目录中分发和引用的ASP.NET MVC3的程序集。...译注:这个链接好像打不开,笔者提供一个方法: 选中ASP.NET MVC引用的程序集,然后查看属性,把“复制到本地”修改为true asp.net mvc3需要的程序集有 System.Web.Mvc

    4.2K10

    Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别!

    1,Assembly.Load()          这个方法通过程序集的长名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集的,会加载此程序集引用的其他程序集,一般情况下都应该优先使用...⑵如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的元素指定的URL来查找 ⑶如果没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹:      假设你的应用程序目录是...,会发生编译错误,如果是动态加载程序集,会在运行时抛出异常!     ...当然这个方法会加载此程序集引用的其他程序集。     ...3,Assembly.LoadFile()           这个方法是从指定的文件来加载程序集,和上面方法的不同之处是这个方法不会加载此程序集引用的其他程序集!

    2.6K10

    WCF集成COM+应用程序遇到的问题

    ,并且CLR在探测到有对该Assembly的引用时,它必须能自动到目录下去寻找这个程序集。...它一般位于厦门的目录下: :\Windows\Assembly\GAC GAC的左右就是提供给CLR一个已知的确定的目录去寻找引用的程序集。...GAC的内部结构 GAC是一个特殊的结构化的目录,用Windows Explorer浏览器你会以为它只是一个包含很多程序集的普通目录。...如果语言的文化是en,则表示:2.0.0.0__en_b77a5c561934e089 OK,还有一个问题:CLR是怎么知道一个程序集需要引用另外的程序集呢?...它一般情况下遵循下面的原则: 1.如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集----->GAC(应该是先找平台相关的,例如:GAC_32,GAC_64,然后找去找GAC_MSIL)。

    67510
    领券