2014-01-15 2 views
3

여기 내 상황이 있습니다. C# 클래스 라이브러리가 있습니다. Rectangle과 같은 일부 유형을 노출합니다. 또한 알고리즘 계산을 수행하는 몇 가지 메소드를 제공합니다.C#과 F를 모두 사용하는 프로젝트의 순환 참조 해결 #

F #에서 알고리즘 비트를 쓰는 것이 좋습니다. 그래서 다른 F # 라이브러리 프로젝트를 솔루션에 추가했습니다.

이제 문제가 있습니다. F # 프로젝트가 알고리즘 계산을 수행하려면 C# 프로젝트의 Rectangle에 대해 알아야합니다. 그리고 C# 프로젝트가 F # 함수를 사용할 수 있으려면 F # 프로젝트를 참조해야합니다. 그래서 순환 참조가 있습니다.

하나의 가능한 솔루션은 Rectangle을 정의한 다음 세 번째 프로젝트를 작성한 다음 F #과 C# 둘 다에서 해당 프로젝트를 참조한 다음 C#에서 F # 프로젝트를 참조하여 함수를 사용할 수 있도록하는 것입니다.

이 문제는 내 라이브러리 사용자가 내 C# 프로젝트뿐만 아니라 추가로 세 번째 프로젝트 (알고리즘에 입력을 제공해야하기 때문에)를 참조해야한다는 것입니다.

F #을 사용하는 것은 구현 세부 사항이며 내 라이브러리가 사용되는 방식에 오버 헤드가 발생하지 않으므로 실제로 허용되지 않습니다.

Rectangle이 C# 프로젝트에 있다고 가정 해 봅니다. 알고리즘의 F # 구현 (F #에서 함수를 호출하는 C#의 메서드)에 대한 "인터페이스"는 C# 프로젝트에도 있습니다. 어떻게 연결하여 작동합니까? 다른 옵션이 있습니까?

순환 참조를 거부하는 것이 이상하게 보입니다. 이처럼 단단히 묶인 프로젝트는 실제로 직접 그래프 구조를 가지고 있지 않습니다.

내가 알고있는 추가 방법이 있습니다. F # 프로젝트는 자신의 Rectangle이고 양쪽 끝에서 직렬화 및 비 직렬화를 수행합니다. 이것은 지루하고 F #을 사용하여 코드를 더 간단하게 만드는 원래의 생각과 반대입니다.

+4

C# 사각형 클래스가 구현하는 F # 프로젝트에서 사각형 인터페이스를 만드는 방법은 무엇입니까? –

+0

C# 사각형에 대한 참조가 F # 어셈블리에 대한 참조를 필요로한다는 것을 의미하지는 않습니까? –

+0

네,하지만 이제는 F #이 C#을 필요로하지 않습니다. 그것은 인터페이스와 함께 작동하는 기능을 노출합니다. –

답변

4

실제 문제는 종속성 자체가 아니라 '패키징'(세 개의 어셈블리를 제공하고 최종 사용자가 두 개 이상의 어셈블리에 연결해야 함)에 대한 우려입니다. 이러한 시나리오에서는 ILMerge을 사용하여 어셈블리를 단일 DLL로 결합하는 것을 고려할 수 있습니다. 따라서 라이브러리에서 하나의 파일 만 전송할 수있는 편리함을 유지하면서 프로젝트에서 적절한 디커플링을 사용할 수 있습니다. 이는 제 3 자 라이브러리 공급 업체가 일반적으로 사용하는 전략입니다.

이 프로세스를 수행하고 난독 화, 라이센스 시행 등과 같은 다른 작업을 수행 할 수있는 다양한 상용 도구가 있지만 실제로 응용 프로그램에 필수인지 여부는 분명하지 않습니다.

+0

그래, 라이브러리 사용자가 FSharp.Core를 참조하는 것을 기억해야한다는 것이 유일한 걱정이라면 F # 라이브러리에서 계산 관련 모든 것을 쓰고 어셈블리를 병합하는 것이 가장 쉽습니다 ... –

+0

@Patryk ILMerge는 실제로 자동으로 '내부화'참조를 지원합니다. 즉, 원래 패키지에서 '공용'으로 구현하면서 최종 패키지 어셈블리의 F # '도우미'어셈블리에서 공용 클래스를 숨길 수 있습니다. 이런 식으로 실제로 FSharp.Core에 대한 참조는 필요하지 않습니다. –

+0

이것은 확실히 선택 사항이지만 Matthew이 의견에서 제안한 것이 최선의 선택 일 수 있다고 생각합니다. 더 많은 합병증이 생기면 나는 볼 수 있습니다. –

1

여기 실제 문제는 C#/F # 1이 아니지만 어셈블리가 AA 사용자도 필요없이 다른 어셈블리 B에서 다른 어셈블리의 형식을 다시 내보낼 수 없습니다. B. 나는 private 멤버로서 F 번호 Rectangle과 함께 F 번호 어셈블리에 Rectangle를 정의하지만, 래퍼 유형으로는 C# 어셈블리에 새로운 Rectangle을 정의하여이 문제를 해결 작업을 제안

. 그런 다음 래퍼 함수를 ​​사용하여 기본 F # 알고리즘을 노출하고 직접 사용할 코드를 호출하는 생성자를 제공 할 수 있습니다.