2012-02-29 2 views
3

몇 가지 공용 클래스와 인터페이스 만 표시하는 많은 내부 기능을 갖춘 C# 라이브러리가 있습니다. 이 코드를 여러 프로젝트에서 공유하고 싶습니다. 각 프로젝트에서 하위 클래스를 사용하여 내부 클래스를 확장해야 할 수도 있습니다.클래스를 만들지 않고 프로젝트간에 C# 코드를 공유합니다.

공통 라이브러리를 만들기 위해 모든 클래스를 공용으로 만드는 아이디어를 좋아하지 않습니다. 나는 그것들을 너무 쉽게 디 컴파일하고 디자인을 깰 수 있다고 생각한다.

소스 코드의 복사본을 만들고 프로젝트간에 이러한 파일을 동기화하는 유일한 방법은 있습니까? 아니면 코드를 공유하고 몇 가지 의도 된 공용 인터페이스와 클래스 만 노출하는 각 프로젝트에 대해 하나의 라이브러리를 얻을 수있는 방법이 있습니까?

나는 비주얼 스튜디오를 컴파일하고 "개인"액세스에 대한 명확한 설명을 위해 2010 년

UPDATE

감사를 사용하고 있습니다. 필자는 여러 입력 라이브러리에 난독 화기를 적용하는 방법을 고려해 볼 수 있다고 생각합니다. 모든 공용 라이브러리는 공개 연결을 모호하게 만듭니다.

디자인 관점에서 볼 때 친구 어셈블리를 사용하는 것이 확실한 것처럼 보입니다.

+1

이렇게하면 디 컴파일로부터 보호를 거의받지 못할 것입니다. 어떤 순진 주의자들은 당신이하려고하는 것을 수행함에있어 OOP 원칙을 확장하고 있다고 말하고 있습니다. 그것은 누출 된 캡슐화입니다. –

+1

액세스 수정자는 디 컴파일에 영향을주지 않습니다. 모든 반사판 응용 프로그램을 사용하여 DLL에서 C# 코드를 추출 할 수 있습니다. 그 면면으로 시간을 낭비하지 마십시오. – Timeout

+0

그럴만 한 이유가 있습니다.이 경우, 여러 입력 라이브러리를 사용할 수 있고 공용 연결을 모호하게 만들 수있는 obfuscator를 사용하는 것이 더 합리적 일 수 있습니다. –

답변

6

당신은 친구 어셈블리를하고보고 할 수 있습니다 : 당신은 "친구"어셈블리를 찾고 있습니다

http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.80).aspx

[assembly:InternalsVisibleTo("someassembly")] 
+0

여기 좀 봐 주실 수 있습니까? http://stackoverflow.com/questions/21301360/share-properties-from-child-app-to-base-project – Goofy

3

새 프로젝트를 만듭니다. 파일> 추가> 기존. 기존 코드 파일을 선택하십시오. 열기 버튼을 클릭하고 링크를 선택하십시오.

클래스를 내부 대 공개로 만드는 것은 decompiled 능력에 절대적으로 아무런 영향을 미치지 않습니다.

+0

마지막 성명서는 "internal vs. public"이 완전히 아닙니다. 참된. 대부분의 Obfuscators는 내부 클래스/메소드를 적극적으로 이름 바꾸기/난독 화하는 반면 공용 클래스의 이름은 바꾸지 않습니다. – Steve

+0

이 솔루션에는 몇 가지 문제가 있습니다. 그러나 제 의견으로는 다른 여러 게시물에 언급 된 친구 어셈블리를 사용하여 직면하게 될 문제보다 덜 성가 시게됩니다. –

+1

@ b1naryj,이 솔루션이 그의 네임 스페이스 규칙을 어떻게 버리겠습니까? 그가 수행하는 모든 작업은 코드가 실제로있는 프로젝트를 참조하지 않는 한 모든 것을 그대로 유지하면서 필요한 파일을 연결하는 것입니다. imho는 친구 어셈블리보다 훨씬 좋은 해결책입니다. – Jason

2

당신은 내가 그들에게 쉽게 컴파일에 너무 많이 노출 생각

0

어셈블리에 InternalsVisibleToAttribute를 사용하여이 작업을 수행 할 수 당신은 심지어 개인 클래스로, 다음 쇼크에있어

어셈블리를 쉽게 컴파일 해제하고 공용 구현을 생성하는 데 사용할 수 있습니다.

"디자인 해체"는 다른 문제입니다. 별도의 프로젝트에서이 코드를 사용하려면 해당 코드를 공개하는 것만 옳은 일입니다. 공개적으로 만들고 싶지 않은 경우이 프로젝트가 실제로 외부에 공개하고 싶은 인터페이스를 생각하면 필요한 것 ...을 구현하고 해당 API를 빌드하여 공개로 설정하십시오.

+0

문제는 두 개의 "public "사용자 : 다른 프로젝트를 수행 할 때 자신과 실제 최종 사용자. –

+0

여기 키가 OP의 한정자 "쉬운"사용이라고 생각합니다. "Boo"의 게시물에 대한 내 의견대로, 평판이 좋은 Obfuscator는 내부 및 개인 클래스/메소드의 이름을 바꾸거나 이름을 바꿉니다. 공용 클래스의 경우에도 동일하게 수행하지 않습니다. 이는 모호한 어셈블리가 디 컴파일 될 수 없음을 의미합니까? 아니요.하지만 이름이 바뀐/맹 글링 된 어셈블리를 통과하는 것이 더 어렵다는 것을 의미합니다. 그래서 - "너무 쉽다", 네. – Steve