12

[InternalsVisibleTo()] 属性を使用して「フレンド アセンブリ」を作成しようとしていますが、うまく機能していないようです。署名済みのフレンド アセンブリを作成するための Microsoft の指示に従いましたが、どこが間違っているのかわかりません。ここで私の手順を詳しく説明します。誰かが私の意図的な間違いを見つけてくれることを願っています...?

厳密な名前のキーを作成し、公開キーを抽出します。したがって、次のようになります。

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

各プロジェクトに厳密な名前のキーを追加し、署名を有効にします。

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")]

そして最後に...ビルド!

次のエラーが表示されます。

エラー CS0122: 保護レベルのため、'Internals.ClassWithInternals' にアクセスできません
エラー CS1729: 'Internals.ClassWithInternals' には 1 つの引数を取るコンストラクターが含まれていません エラー CS1061: 'Internals.ClassWithInternals' には 'Message' の定義が含まれておらず、タイプ 'Internals.ClassWithInternals' の最初の引数を受け入れる拡張メソッド 'Message' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

基本的に、InternalsVisibleTo 属性を使用していないかのようです。さて、私はツールのせいにするつもりはありません。誰?

4

1 に答える 1

15

InternalsVisibleTo属性のアセンブリ名の後にカンマがありません。

そのはず:

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

アセンブリ参照は扱いにくい場合があり、残念ながらコンパイラは属性内に文字列として表示される場合、それらを検証しようとしません。アセンブリ参照のスペルを間違えたり、無効なキーを指定すると、すべてがコンパイルされますが、機能しません。

于 2010-04-30T18:21:14.713 に答える