development

친구 어셈블리를 선언하는 방법?

big-blog 2020. 8. 6. 07:46
반응형

친구 어셈블리를 선언하는 방법?


내 솔루션에는 2 개의 프로젝트가 있습니다.

  1. 조립 (기본 라이브러리)
  2. 테스트 어셈블리 (NUnit)

첫 번째 프로젝트에서 테스트 어셈블리를 프렌즈 어셈블리로 선언했습니다.

[assembly: InternalsVisibleTo ("Company.Product.Tests")]

어셈블리에 서명하기 위해 솔루션을 설정하는 것을 잊었을 때까지 모든 것이 잘 작동했습니다. 따라서 snk 파일을 만들고 Visual Studio 프로젝트를 설정하여 첫 번째 어셈블리 (기본 라이브러리)에 서명합니다. 이제 첫 번째 프로젝트를 컴파일하면 다음 오류가 발생합니다.

친구 어셈블리 참조 'Company.Product.Tests'가 유효하지 않습니다. 강력한 이름의 서명 된 어셈블리는 InternalsVisibleTo 선언에 공개 키를 지정해야합니다.

sn 유틸리티를 사용하여 snk 파일에서 공개 키를 추출하려고 시도했지만 사용 방법을 잘 모르는 유선 이진 파일을 생성합니다. 문제를 어떻게 해결할 수 있습니까?


효과적으로 두 어셈블리가 서로를 참조하므로 어셈블리 에 서명해야합니다 .

공개 키를 InternalsVisibleTo 특성에 넣어야합니다. 예를 들어, 프로토콜 버퍼에서 나는 다음을 사용합니다.

[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]

공개 키는 다음을 실행하여 검색됩니다.

sn -Tp path\to\test\assembly.dll

또는 .snk 파일에서 가져 오십시오.

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk

sn.exe로 마술없이 원하는 어셈블리에서 publicKey를 직접 가져올 수 있습니다.

<!-- language: c# -->
var assemblyName = Assembly.GetExecutingAssembly().GetName();
Console.WriteLine("{0}, PublicKey={1}",
    assemblyName.Name,
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m))));

"Company.Product.Tests, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 17135d9fcba0119f"와 같은 강력한 이름을 입력해야한다고 생각합니다. Company.Product.Tests는 어셈블리 이름이고 17135d9fcba0119f는 공개 키라고 가정합니다.

이 문제를 해결하는 다른 방법은 별도의 어셈블리를 사용하지 않는 것입니다. 나는 보통 소스 코드와 테스트 코드를 같은 어셈블리에 넣었다. 나는 당신이 그들을 분리 해야하는 특별한 우려가 있는지 모르겠습니다.

참고 URL : https://stackoverflow.com/questions/1123683/how-to-declare-a-friend-assembly

반응형