首页
学习
活动
专区
工具
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

    18210

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

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

    28320

    C#动态加载和使用程序

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

    94400

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

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

    1.3K20

    怎样反射程序

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

    52220

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

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

    83370

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

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

    77520

    关于强命名程序

    如何部署强命名程序( 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中抽取公钥保存到

    64610

    使Spring.NETIOC容器支持动态加载程序

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

    69640

    程序员级别鉴定书(.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 文件,显然这样文件是不适合作为

    59720

    【翻译】在没有安装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.5K10

    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)。

    67010

    微信小程序原理来看app如何搭建自己程序环境

    前沿 还记得当初小程序刚出来爆火场景,依附于微信确实是给我们带来了极大便利,有着微信流量,用完即走,无需下载,随时使用,17年到23年,小程序已经深入人心,吃喝玩乐你都可以找到小程序身影,疫情期间各种码场景也给小程序带来了巨大流量...当然不只是微信小程序,各大平台都推出了自己程序,像支付宝小程序、百度小程序、抖音小程序等等,这些app都紧跟潮流,实现了自己程序框架,经过了五年多时间发展,小程序框架已经趋于稳定,对于前端开发来说...它原理是什么?我们如何在自己app上搭建一套小程序体系?...代码获取一些用户敏感数据通过dom操作,那用户信息泄漏会将事情变无法进行 所以基于这些情况,微信内部阻止了一些操作dom,跳转,动态脚本执行接口,只提供了一些js脚本执行器,所以小程序提供了一个沙箱环境...,但是这个工作量无疑是巨大,既然这已经是一套成熟方案,那如何在自己app里面搭件一套小程序环境呢?

    2.4K10

    IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序之间 InternalsVisibleTo 关系

    本文告诉大家如何在使用 IIncrementalGenerator 进行增量 Source Generator 生成代码时,如何判断两个程序之间是否存在 InternalsVisibleTo 关系...当获取到两个程序时,如果要开始准备生成相关代码,可能会因为不知道两个程序之间是否存在 InternalsVisibleTo 关系,也就是是否应该导出其 internal 类型而困扰。...,获取到对当前正在分析项目设置 InternalsVisibleTo 引用程序,将程序名作为生成代码部分,让正在被分析项目可以编写代码输出有哪些程序是 internal 可见 先新建以下...回到咱这个例子任务上,就是在 Analyzers 分析器项目编写代码,分析 App 项目所引用程序里面的存在哪些程序对 App 程序设置了 internal 可见 完成准备工作之后,接下来开始本文核心逻辑编写...而 referencedAssemblySymbols 里面都是当前 App 程序引用程序

    26220
    领券