2009-07-14 4 views
92

내 솔루션이 개 프로젝트가친구 어셈블리를 신고하는 방법은 무엇입니까?</p> <ol> <li>조립 (기본 라이브러리)</li> <li>시험 조립 (NUnit과) I 어셈블리 첫 번째 프로젝트에서 친구로 테스트 어셈블리를 선언했다</li> </ol> <p>:

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

내 어셈블리에 서명하는 솔루션을 설치하는 것을 잊었을 때까지 모든 것이 잘 작동했습니다. 그래서 snk 파일을 만들고 첫 번째 어셈블리 (기본 라이브러리)에 서명하도록 Visual Studio 프로젝트를 설정합니다.

Friend assembly reference 'Company.Product.Tests' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations.

내가 SN 유틸리티를 사용하여 내 SNK 파일에서 공개 키를 추출하기 위해 시도했지만 내가 사용하는 방법을 확실하지 오전 유선 바이너리 파일을 생성합니다 : 내가 처음 프로젝트를 컴파일 할 때 지금, 나는 오류 다음 얻는다. 문제를 어떻게 해결할 수 있습니까?

답변

168

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

공개 키를 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 
+0

동일한 키로 서명 된 여러 어셈블리가 동일한 공개 키로 끝나지 않습니까? 아마도이 문제를 해결하기 위해 "최종 실행"을 제공 할 수 있습니까? – Bevan

+0

@Bevan : 예, 그렇습니다. 아마도 키를 사용하여 더미 파일을 컴파일하는 것이 더 빠른 방법 일 것입니다. 편집하십시오. –

+0

두 어셈블리가 서로 다른 키로 서명되는 경우, (InternalsVisibleTo 특성 내에서) 친구 어셈블리의 공개 키를 지정해야한다고 가정합니다. 그게 맞지? – Hemant

-5

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

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

+0

버전 번호와 문화권을 지정해야한다고 생각하지 않습니다 (http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx 참조). 나는 실제로 어셈블리 자체에 테스트 코드를 넣으려고 시도하지 않았다. 그것이 어떻게 작동하는지 시험해 볼 것입니다 (팁 +1). – Hemant

+4

InternalsVisibleTo의 경우 PublicKeToken으로 충분하지 않습니다. - 공개 키가 필요합니다 :-( –

-4

당신은 directrly 수 관심있는 어셈블리에서 publicKey를 받으십시오. sn.exe가있는 마법없이

<!-- 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)))); 
+1

이것은 _this_ 질문에 대한 답변이 아닙니다. 그것은 [그것은 해결됩니다 답변]에 대한 코멘트해야합니다 (http://stackoverflow.com/a/1123831/1350209) –