2017-12-01 8 views
0

한 - 라이너 질문은 의미를, 그래서 나 세부 내 도전을 허용하지 않습니다 및 회원. 모든 클래스, 유형 및 멤버는 해당 기본 네임 스페이스 (어셈블리 이름과 동일)입니다.여러 어셈블리에 걸쳐 C# 네임 스페이스를 확장하는 방법은 무엇입니까? 각 "내부"클래스 유형의 자신의 세트를 포함, 내가 3 DLL을 만든</p> <p>(<strong>MyUtils, MyConnector, MyAgent</strong>) :

  1. MyAgent는 MyConnector에 대한 참조를 추가하고 해당 클래스 중 일부를 사용해야합니다. MyConnector는 MyUtils에 대한 참조를 추가하고 그 중 일부 클래스를 사용해야합니다. 현재 MyAgent는 MyUtils의 일부 유형에 액세스해야 할 수도 있습니다.

    이제 MyUtils의 모든 유형과 멤버가 내부이므로 MyConnector에 대한 참조 및 MyConnector에서 MyAgent 로의 참조로 추가 할 수 없습니다. DLL에 직접 액세스하는 응용 프로그램을 원하지 않기 때문에 이러한 형식을 공개하지 않으려합니다.

    이론적으로 여러 어셈블리에 걸쳐 네임 스페이스를 확장 할 수는 있지만 위의 시나리오를 실제로 달성하는 방법을 명확히 이해하지 못했습니다.

  2. 마지막으로 MyAgent.dll을 배포하여 EXE에 사용하려고합니다. 이 EXE는 MyAgent 메서드에서 반환되는 MyConnection 개체 (MyConnector에 포함 된 형식)를 제외하고 MyAgent의 공용 형식에만 액세스해야합니다. 여기에서도 내 액세스 지정자 (내부)가이 가능성을 제한합니다.

나는 이것을 너무 많이 모른 채 지금 완전히 혼란스러워하고 있습니다. 숙련 된 프로그래머의 조언을 매우 중요하게 생각합니다.

미리 감사드립니다. 여러 어셈블리를 통해 네임 스페이스를 스패닝

+0

이 문제에 대한 해결책은 아니지만 공용 형식이없는 유틸리티 어셈블리의 가치에 의문을 제기합니다. 유틸리티 유형을 내부에 유지하려는 이유에 대해 자세히 설명해 주시겠습니까? –

+0

아마도 나는 분명하지 않았습니다. 마지막 dll (MyAgent)에는 public 형식도 있으며, exe가 호출하는 형식입니다. 그러나 지원 요구 사항을 포함하고있는 다른 모든 어셈블리의 구현 세부 사항을 숨길 필요가있었습니다.공개적으로 만들면 intellisese 목록에 불필요한 잡음이 추가 될뿐만 아니라 exe 개발자가해서는 안되는 것을 가지고 놀 수있게합니다. –

+0

어쨌든 공개적으로 얼마나 많은 것을해야할지에 대해서는 약간의 타협만으로 원하는대로 달성 할 수있는 방법을 찾은 것 같습니다. 그래서 나는이 문제를 해결할 것을 고려하고 있으며 새로운 질문을 던질 것입니다. 시간 내 줘서 고마워. –

답변

4

매우 간단 수행됩니다

file1.cs을 조립 1 : assembly2에서

namespace MyNamespace { ... } 

file2.cs :

namespace MyNamespace { ... } 

그러나이 won' intenal 액세스 수정자가 동일한 클래스 내의 모든 클래스에 표시되도록합니다. 어셈블리, 네임 스페이스에 관계없이. 따라서 assembly1 내에 두 개의 네임 스페이스가 있더라도 assembly1.MyNamespace에 선언 된 모든 내부 멤버에 액세스 할 수 있지만 assembly2.MyNamespace에있는 멤버는 액세스 할 수 없습니다.

따라서 이 있으니 다른 어셈블리에서 액세스하려면 public이됩니다. 또는 다른 어셈블리의 내부 멤버에도 액세스 할 수있는 소위 "친구 어셈블리"라고 지정할 수도 있습니다. 이렇게하려면 코드에 InternalsVisibleTo(fullNameForAssembly2)을 추가하십시오.

+0

오, 예, 내부는 조립 범위입니다! 범위를 네임 스페이스로 제한 할 수있는 방법이 있습니까? 나는 그들이하지 말아야 할 클래스에 대한 메서드를 호출하는 dll 사용자를 원하지 않습니다. 편집 : 당신이 언급 한 대안을 체크 아웃합니다. 감사. –

+1

마지막 단락을 참조하십시오. internalsvisibleto 속성은 당신이 찾고있는 속성입니다. – HimBromBeere

+0

나는 당신에게 알려야한다고 생각했다 : 나는 그 속성을 사용하지 않았지만 게시 한 링크에서 새로운 것을 배웠다. 그리고 얼마 동안은 도움이 될 것 같다. 그 동안 나는 그것을 더 간단하게 유지하고 내가 원한 것을 거의 달성했다. 얼마만큼 공개해야하는지에 대해서는 조금 타협했다. 그래서 나는이 문제를 해결할 것을 고려하고 있으며 새로운 질문을 던질 것입니다. 시간 내 줘서 고마워. –