InternalSvisibleto 관리 C ++에서는 작동하지 않습니다
-
03-07-2019 - |
문제
InternalSvisibleto는 관리되는 C ++ 프로젝트에서 작동하지 않지만 C# 프로젝트를위한 것입니다. 모든 도움이 감사하겠습니다. 여기 단순화 된 레이아웃이 있습니다.
프로젝트 ㅏ -C#, 액세스하고 싶은 내부 속성이 있습니다. 기원전.
프로젝트 비 - 관리 된 C ++. 참조 ㅏ.
프로젝트 씨 -C#, 참조 ㅏ.
모든 프로젝트는 동일한 키로 서명되었습니다. ildasm 또는 반사기가있는 컴파일 된 어셈블리를 보면 내부 속성 사용을 언급 할 때 모두 올바르게 서명되었음을 보여줍니다.
프로젝트의 AssemblyInfo.cs에서 ㅏ, 나는 다음과 같은 내부를 가지고있다;
[assembly: InternalsVisibleTo( "B, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" )]
[assembly: InternalsVisibleTo( "C, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" )]
열쇠가 자르기 때문에 옳다는 것을 알고 있습니다.
컴파일하려고 할 때 A & C. 잘 컴파일하지만 프로젝트 비 실패합니다
Error 1 error C3767: 'A::MyClass::MyProperty::get': candidate function(s) not accessible c:\Users\<snip>\CppClass.cpp 201 B
MSDN 문서는 이것이 C ++와 함께 작동한다고 말합니다. 버그 나 내가해야 할 일이 있습니까?
부동산을 보호 할 수있는 또 다른 방법이 있습니까? 나는 모든 조립품을 보호 할 수 있다는 것을 알고 있지만 이와 같이 세분화 된 수준에서 할 수 있습니까?
편집하다
MSDN의 의견을 바탕으로 속성을 다음으로 변경했지만 여전히 작동하지 않습니다.
[assembly: InternalsVisibleTo( "B, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" ),
InternalsVisibleTo( "C, " +
"PublicKey=00240000048000009400000006020000002400005253413100040000010001007" +
"50098646D1C04C2A041FAAF801521A769535DE9A04CD3B4DEDCCBF73D1A6456BF4FE5881451" +
"0E84983C72D0460B8BA85C52A9CACDC4A0785A08E247C335884C2049ECFE6B2C5E20A18FE4B" +
"9BFF009ADA232E980D220B3C9586C9C5EE29C29AEE8853DB7BB90CF5A4C704F5244E1A1085C" +
"4306008535049A0EBB00FE47E78DCB" )]
해결책
나는 이것에 대한 답을 찾았다. C ++는 다른 언어와 다르게 작동합니다. InternalSvisibleto 외에도 참조 어셈블리를 참조해야합니다. ㅏ 이랑 친구로서 예어. AS_Friend는 참조 추가 대화 상자에서 옵션이 아니기 때문에 프로젝트 참조를 추가 할 수 없으며 대신 필요한 각 CPP 파일에 참조를 추가해야합니다.
#using <A.dll> as_friend
그런 다음 프로젝트 A의 빌드 디렉토리를 포함하려면 조립 검색 경로를 변경해야합니다.
IMHO, 이거야 2 등석 언어 인 C ++의 깨진 및 전형적인. 프로젝트 참조 기능이 없으면 빌드 디버그 또는 릴리스 디렉토리에서 어셈블리를 참조하게됩니다. 이렇게하면 의존성이 깨지며 디버그에서 릴리스로 구성을 변경할 때 올바른 DLL을 참조 할 수있는 유일한 방법은 Ugly #ifdef 디버그 및 #using의 상대 경로입니다.
나는 또한 이것이 언급되지 않았다는 것에 실망했다. InternalSvisibleToattribute 선적 서류 비치. 나는 주위를 파야했다 C ++ 문서 정보를 찾으려면.
편집하다: 문서 InternalSvisisBleto 그 이후로 링크로 업데이트되었습니다 친구 어셈블리 (C ++) 문서.