这个有点超出我的理解能力了😂
所有代码肯定都是编译后执行的;
编译不需要指定程序集,有内存程序集;
所有程序集编译后会加载到进程里,似乎没有办法区分哪个程序集里的。不过我没有这方面的经验。
gpt是这么说的:
在 .NET 中,类型的完整标识不仅仅包括命名空间和类型名称,还包含所在的程序集(Assembly)信息。也就是说,即使多个 DLL 中有相同的命名空间和类型名称,只要它们来自不同的程序集,CLR 会把它们视为不同的类型。
如果同时加载到进程中,它们的区分主要有两种方法:
程序集限定名
每个类型都有一个程序集限定名,格式大致为:
命名空间.类型名称, 程序集名称, 版本, 文化, 公钥标记
在反射或其他需要精确区分类型的场景中,可以使用这种方式来明确指定某个类型。
使用 extern alias
当在一个项目中引用了多个包含相同命名空间和类型名称的 DLL 时,可以在项目中为其中一个或多个引用指定别名。然后在代码中使用 extern alias
来区分这些类型。例如:
csharp// 为两个引用分别指定别名(在项目文件或引用属性中设置) // 假设引用的 DLL 分别为 AssemblyA.dll 和 AssemblyB.dll, // 分别被设置为别名:AliasA 和 AliasB extern alias AliasA; extern alias AliasB; using AType = AliasA::MyNamespace.MyType; using BType = AliasB::MyNamespace.MyType; class Program { static void Main() { AType objA = new AType(); BType objB = new BType(); // objA 和 objB 是来自不同 DLL 的同名类型,但它们被区分开了 } }
这样,通过使用程序集限定名或者 extern alias
,开发者可以在同一个进程中同时加载和区分来自不同 DLL 中的相同命名空间和类型名称。
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
之前用这个编译程序集加密动作时,就是排除指定程序集,再添加指定的,因为Quicker引用mscorlib 程序集与加载的程序集冲突,导致使用这个编译失败,所以就复制程序集,用
Mono.Cecil库改一下版本号,把Quicker自己加载的mscorlib 程序集排除,使用自己改了版本的程序集,才编译成功,没有冲突,可以在动作内调用,所以后面问了你加密的可不可以发😂.虽然我后面去学另外的,不会再碰到会影响用户权限的代码了
编译肯定会需要程序集,个人理解应该是能中间插一手筛选的
我看H-D-G大佬的demo动作Demo:自定义窗口——WinForm - by H-D-G - 动作信息 - Quicker,这里也有程序集添加,所以应该可以筛选截取,剔除不需要的