InternalsVisibleTo 属性允许你指定一个或多个程序集,这些程序集可以访问当前程序集中的内部类型。 本文将介绍如何指定多个项目的 InternalsVisibleTo,从而不需要在每个项目中都指定一遍。 代码演示 假如我们有一个项目,名称为 TestProject1。 则我们需要在 TestProject1 中指定 InternalsVisibleTo 属性,如下所示: [assembly: InternalsVisibleTo("TestProject1.Tests ")] 但其实,我们也可以在 TestProject1.csproj 中指定 InternalsVisibleTo 属性,如下所示: <Project> <ItemGroup> 总结 本文介绍了如何指定多个项目的 InternalsVisibleTo 属性,从而不需要在每个项目中都指定一遍。
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何判断两个程序集之间是否存在 InternalsVisibleTo 关系 当获取到两个程序集时,如果要开始准备生成相关代码,可能会因为不知道两个程序集之间是否存在 InternalsVisibleTo 关系,也就是是否应该导出其 internal 的类型而困扰。 在能够获取到 IAssemblySymbol 类型的对象,即可通过 GivesAccessTo 方法判断两个程序集的 InternalsVisibleTo 关系 这个 GivesAccessTo 方法可以获取到当前的程序集对给定的程序集参数是否为 在 Lib2 里面添加一个 AssemblyInfo.cs 文件,在 AssemblyInfo.cs 文件里面记录 InternalsVisibleTo 给到 App 程序集,如以下代码。 没有对 App 项目 internal 可见,而 Lib2 对 App 项目 internal 可见 using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo
"/> <InternalsVisibleTo Include="HikallyijuDallcurjemdehowai"/> </ItemGroup> 那么这个 NuGet 库的原理是什么 ->Count())' > 0"> <AssemblyAttribute Include="System.Runtime.CompilerServices.<em>InternalsVisibleTo</em> "> <_Parameter1>%(InternalsVisibleTo.Identity)</_Parameter1> </AssemblyAttribute> < /ItemGroup> </Target> 也就是添加一个 AddInternalsVisibleTo 的 Target 在开始构建之前触发 内容就是读取 InternalsVisibleTo 项的内容 ,加入到 AssemblyAttribute 这里,而在上文小伙伴了解到放在 AssemblyAttribute 的内容将会被输出 用这个方法就可以做到写 InternalsVisibleTo 就可以自动创建
可以访问到 A 程序集里面所有的 internal 成员,那么我可以在 A 程序集里面通过 InternalsVisibleToAttribute 加上友元程序集,如下面代码 [assembly: InternalsVisibleTo 强名称签名的程序集必须在其 InternalsVisibleTo 声明中指定一个公钥。 添加了强签名的程序集用途是说明这个程序集是谁发布的,而没有任何保密等作用。 如上面例子的 B 程序集,也使用一个密钥文件进行签名,签名之后,还需要将密钥文件的公钥写到 InternalsVisibleTo 的参数里面,格式如下 [assembly: InternalsVisibleTo dc97d4cab25f70524ca74912121a1f2233c96cd501b5efc717d933bf15f23d256aa7cf37b9ce81 4fd2def1 公钥标记为 d9b785a303650e22 在代码里面将公钥内容替换到上面的 ** 内容,大概如下 [assembly: InternalsVisibleTo
1: [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Test)] 二、如果对Lib添加强签名呢? Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations.” ? 1: [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Test, Version=1.0.0.0, Culture=neutral InternalsVisibleTo declarations cannot have a version, culture, public key token, or processor architecture 8dba6a4f4e33b7dc 我们只需要将该公钥指定到InternalsVisibleToAttribute特性中即可: 1: [assembly: System.Runtime.CompilerServices.InternalsVisibleTo
InternalsVisibleToAttribute特性 首先,我们在项目FooALibray新增->程序集信息文件,那么就获得一个初始的AssemblyInfo类了,然后我们只需新增以下代码: [assembly: InternalsVisibleTo
项目B命名空间 Test.B 在Test.B 中通过dynamic关键字调用Test.A中匿名类型时报上述错误 解决办法: 在项目A的AssemblyInfo.cs中加上: [assembly: InternalsVisibleTo
因此需要在AssemblyInfo.cs添加 [assembly:InternalsVisibleTo("DynamicProxyGenAssembly2")] [assembly:InternalsVisibleTo
三.友元程序集解析 扯了半天,终于到讲解“友元程序集”这一个概念,“友元程序集”在.NET2中提出,使用InternalsVisibleToAttribute来实现这一特性,InternalsVisibleTo 友元程序集实例介绍: //AssemblySource.DLL [assembly: InternalsVisibleTo(DotNetShare)] public class AssemblySource
privatestringDecryptToken(stringencrypted){//解密逻辑}}有时需要让测试程序集访问内部成员,同时保持生产代码的安全性:展开代码语言:C#AI代码解释//AssemblyInfo.cs[assembly:InternalsVisibleTo ("HagiCode.Application.Tests")][assembly:InternalsVisibleTo("DynamicProxyGenAssembly2")]//forMoq这样测试起来方便多了
准备工作 如果你需要测试项目中的Internal成员,你需要在AssemblyInfo.cs中添加如下的Attribute: #if DEBUG [assembly: InternalsVisibleTo
DoNotWrapExceptions 你可能会有的疑问 如果 A 程序集对 B 程序集内部可见(InternalsVisibleTo("B")),那么 B 在反射查找 A 的时候,internal 成员的查找应该使用
//Make the internals visible to the test assembly [assembly: InternalsVisibleTo("MyTestAssembly")] 2:
这样的调试效率太低了 实际上本文提供的方法是给 WPF 每个项目都加上了一句 InternalsVisibleTo 到 dotnetCampus.WPF 程序集而已 使用这个方法也是有缺点的,如需要额外添加整个程序集以及在
▲ 没用到的类将消失 特别注意,如果标记了 InternalsVisibleTo,尤其注意不要不小心被误删了。 需要 特别小心如果有 InternalsVisibleTo 或者依据名称的反射调用,这种混淆下极有可能挂掉!!!请充分测试你的软件,切记!!! 尽量选择 任意选择类/方法名和字段名的级别,只要能编译通过就行(因为无论选哪个,对程序的影响都一样,逆向的难度差异也较小) 名称混淆不影响程序执行性能,所以只要能打开,就尽量打开 如果有 InternalsVisibleTo
dotnet 强签名下使用 InternalsVisibleToAttribute 给程序集加上友元 拿到签名,然后拼接 InternalsVisibleToAttribute 的内容 [assembly:InternalsVisibleTo
代码如下: [assembly: InternalsVisibleTo("Hospital.Tests")] 这表示Hospital.Tests这个测试项目可以访问该项目生产代码(production
代码如下: [assembly: InternalsVisibleTo("Hospital.Tests")] 这表示Hospital.Tests这个测试项目可以访问该项目生产代码(production
为了使得我们标记的方法在合适的时间调用,它们必须是public类型的(或者包含一个合适的InternalsVisibleTo属性),并且具有一个StreamingContext参数。
说几个大家可能在单元测试过程中可能涉及到的几个小点: 有时候您会测试一个internal级别的类,但是当测试项目引用之后是没有办法找到该类的,您可以通过将程序集标记为对测试项目可见来进行测试: [assembly: InternalsVisibleTo