c# - C# 中的友元程序集

我正在尝试使用 [InternalsVisibleTo()] 属性创建一些“ friend 程序集”,但我似乎无法使其正常工作。我已按照 Microsoft 对 creating signed friend assemblies 的说明进行操作。而且我看不出哪里出错了。所以我会在这里详细说明我的步骤,希望有人能发现我故意的错误......?

创建一个强名称 key 并提取公钥,因此:

sn -k StrongNameKey
sn -p public.pk
sn -tp public.pk

为每个项目添加强名称 key 并启用签名。

创建一个名为 Internals 的项目和一个具有内部属性的类:

namespace Internals
{
    internal class ClassWithInternals
    {
        internal string Message { get; set; }
        public ClassWithInternals(string m)
        {
            Message = m;
        }
    }
}

创建另一个名为 TestInternalsVisibleTo 的项目:

namespace TestInternalsVisibleTo
{
    using Internals;

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            var c = new Internals.ClassWithInternals("Test");
            Console.WriteLine(c.Message);
        }
    }
}

编辑 Internals 项目的 AssemblyInfo.cs 文件,并添加必要的属性:

[assembly: AssemblyTitle("AssemblyWithInternals")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Internals")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("41c590dc-f555-48bc-8a94-10c0e7adfd9b")]

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: InternalsVisibleTo("TestInternalsVisibleTo PublicKey=002400000480000094000000060200000024000052534131000400000100010087953126637ab27cb375fa917c35b23502c2994bb860cc2582d39912b73740d6b56912c169e4a702bedb471a859a33acbc8b79e1f103667e5075ad17dffda58988ceaf764613bd56fc8f909f43a1b177172bc4143c96cf987274873626abb650550977dcad1bb9bfa255056bb8d0a2ec5d35d6f8cb0a6065ec0639550c2334b9")]

最后…… build !

我收到以下错误:

error CS0122: 'Internals.ClassWithInternals' is inaccessible due to its protection level
error CS1729: 'Internals.ClassWithInternals' does not contain a constructor that takes 1 arguments error CS1061: 'Internals.ClassWithInternals' does not contain a definition for 'Message' and no extension method 'Message' accepting a first argument of type 'Internals.ClassWithInternals' could be found (are you missing a using directive or an assembly reference?)

基本上,就好像我没有使用 InternalsVisibleTo 属性一样。现在,我不会落入指责工具的陷阱,那么这里有什么?有人吗?

最佳答案

您的 InternalsVisibleTo 属性中的程序集名称后缺少逗号。

应该是:

[assembly: InternalsVisibleTo("TestInternalsVisibleTo, PublicKey=....];

程序集引用可能很挑剔,不幸的是,当它们作为字符串出现在属性内部时,编译器不会尝试验证它们。如果您拼写错误的程序集引用或提供无效的 key - 一切都会编译 - 但只是不起作用。

https://stackoverflow.com/questions/2746549/

相关文章:

java - 无法解析不同风格android studio的方法 'getAllUserGroupB

build - Gulp-Inject 不起作用

haskell - 由于 native 依赖项中的 "multiple definition"链接器

build - Intellij IDEA 项目中的自定义构建步骤

java - 从相同的源代码构建可以产生功能不同的可执行文件吗?

scala - 如何构建独立的 scala 可执行文件

build - 如何选择哪个 CMake 可执行目标将是默认目标?

c++ - 在 CMake 中使用编译器前缀命令(distcc、ccache)

ant - 如何在项目之间最好地共享 Ant 目标?

iphone - Xcode:为不同的构建配置设置 GCC_PREPROCESSOR_DEFINIT