You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中为前缀匹配的项目配置InternalsVisibleTo?

问题分析与解决方案

首先明确:.NET的InternalsVisibleTo特性不支持通配符或前缀匹配,必须明确写出每个要授权访问的程序集的完整名称,这是设计上的限制——所以你用$(MSBuildProjectName).Abca这类变量或者想匹配Test.开头的写法根本不生效,只有写死Test.Abca才能正常工作。

如果你想让所有Test.开头的项目都能访问TestA的内部类,可以试试以下几种方案:

方案一:将内部类改为public(最简单但不推荐)

直接把TestA里的internal class MyClass改成public class MyClass,所有引用TestA的项目就能直接访问它。但缺点是破坏了内部封装逻辑,不符合你用internal的初衷。

方案二:使用共享项目(Shared Project)

把需要共享的内部代码放到共享项目中,让所有Test.开头的项目直接引用这个共享项目:

  1. 在解决方案里新建一个共享项目(比如命名为TestShared);
  2. 把TestA里的MyClass移动到TestShared中,保持internal修饰符不变;
  3. 让TestA和所有Test.开头的项目都引用TestShared;
    所有引用共享项目的项目会直接把这段代码嵌入到自身程序集里,自然能访问internal类,完全不需要InternalsVisibleTo配置。

方案三:用MSBuild批量生成授权配置(推荐,兼顾封装和批量需求)

如果不想调整代码结构,可以通过MSBuild脚本自动收集解决方案里所有Test.开头的项目,动态生成InternalsVisibleTo属性:

修改TestA的csproj文件,替换原来的ItemGroup部分为以下内容:

<ItemGroup>
  <!-- 遍历解决方案中的所有项目,筛选名称以Test.开头的 -->
  <TestProject Include="..\Test.*.csproj" />
  <!-- 为每个匹配的项目生成InternalsVisibleTo属性 -->
  <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo"
                     Condition="Exists('%(TestProject.FullPath)')">
    <_Parameter1>$([System.IO.Path]::GetFileNameWithoutExtension('%(TestProject.FullPath)'))</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>

这段脚本会自动查找当前目录上级目录中所有以Test.开头的csproj文件,为每个符合规则的项目生成对应的InternalsVisibleTo授权——后续新增Test.开头的项目时,只要项目文件命名符合规则,就会自动被授权,无需手动修改TestA的配置。

注意:如果你的Test.开头项目不在上级目录,需要调整Include的路径(比如用**\Test.*.csproj匹配所有子目录)。


内容的提问来源于stack exchange,提问作者TOAN-VN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:52:37