C# 我是否可以拒绝从应用程序集属性的程序集外部访问该程序集属性?

C# 我是否可以拒绝从应用程序集属性的程序集外部访问该程序集属性?,c#,reflection,.net-assembly,C#,Reflection,.net Assembly,我是否可以将程序集属性(如[assembly:AssemblyMetadata(“key”、“value”)])标记为private/internal,以使其只能从应用于的程序集中访问 背景: 我刚刚测试了一种通过AssemblyMetadata属性和自定义msbuild目标在代码(例如解决方案目录)中获取一些生成信息的技术,方法是将以下类添加到项目中,并将msbuild目标添加到*.csproj文件中: static class BuildEnvironment { static st

我是否可以将程序集属性(如
[assembly:AssemblyMetadata(“key”、“value”)]
)标记为private/internal,以使其只能从应用于的程序集中访问

背景: 我刚刚测试了一种通过
AssemblyMetadata
属性和自定义msbuild目标在代码(例如解决方案目录)中获取一些生成信息的技术,方法是将以下类添加到项目中,并将msbuild目标添加到*.csproj文件中:

static class BuildEnvironment
{
    static string _solutionDir;

    public static string SolutionDirectory
    {
        get
        {
            if (_solutionDir == null)
                _solutionDir = Initialize();
            return _solutionDir;

            string Initialize()
            {
                var metadata = typeof(BuildEnvironment).GetTypeInfo().Assembly.GetCustomAttributes<AssemblyMetadataAttribute>();
                return metadata.FirstOrDefault((x) => x.Key == "SolutionDir")?.Value ?? string.Empty;
            }
        }
    }
}


<Target Name="GenerateBuildEnvironment" BeforeTargets="CoreCompile">
    <ItemGroup>
        <AssemblyAttributes Include="AssemblyMetadata">
            <_Parameter1>SolutionDir</_Parameter1>
            <_Parameter2>$(SolutionDir)</_Parameter2>
        </AssemblyAttributes>
    </ItemGroup>
    <WriteCodeFragment AssemblyAttributes="@(AssemblyAttributes)" Language="C#" OutputDirectory="$(IntermediateOutputPath)">
        <Output TaskParameter="OutputFile" ItemName="Compile" />
    </WriteCodeFragment>
</Target>
静态类构建环境
{
静态字符串_solutionDir;
公共静态字符串解决方案目录
{
得到
{
if(_solutionDir==null)
_solutionDir=Initialize();
返回_solutionDir;
字符串初始化()
{
var metadata=typeof(BuildEnvironment).GetTypeInfo().Assembly.GetCustomAttributes();
返回metadata.FirstOrDefault((x)=>x.Key==“SolutionDir”)?.Value??string.Empty;
}
}
}
}
SolutionDir
$(SolutionDir)
我是否可以将程序集属性(如
[assembly:AssemblyMetadata(“key”、“value”)]
)标记为private/internal,以使其只能从应用于的程序集中访问

不需要。元数据的要点是它需要能够从.NET本身或外部工具(如Reflector或JetBrains DotPeek)中读取。根据定义,元数据是公共的。隐藏它就达不到目的

如果希望此类信息为私有信息,请不要使用.NET程序集属性。您可以将其存储为资源,并使用您喜欢的保护方法对其进行保护

我是否可以将程序集属性(如
[assembly:AssemblyMetadata(“key”、“value”)]
)标记为private/internal,以使其只能从应用于的程序集中访问

不需要。元数据的要点是它需要能够从.NET本身或外部工具(如Reflector或JetBrains DotPeek)中读取。根据定义,元数据是公共的。隐藏它就达不到目的

如果希望此类信息为私有信息,请不要使用.NET程序集属性。您可以将其存储为资源,并使用您喜欢的保护方法对其进行保护