2009-10-28 1 views
0

모노 (Type.GetType ("Mono.Runtime")! = null)를 기반으로 코드를 분기하는 방법을 알고 있지만 모노 코드 경로가 Mono가 Mono가 아닌 코드 경로에 필요한 어셈블리를로드하려고 시도하고 있습니다. 이 모든 것이 놀라운 것은 아니지만 문제를 해결하려면 어떻게해야합니까? 다른 클래스의 Mono가 아닌 어셈블리에 대한 호출을 시도했지만 시도가 도움이되지 않았습니다.모노에서 실행할 때 특정 어셈블리 참조를 방지하려면 어떻게해야합니까?

답변

2

직접 볼 수있는 유일한 방법은 Reflection입니다.

저는 원형 또는 .NET에 의존하는 모든 코드를 각 플랫폼마다 별도의 어셈블리로 리팩토링하는 방식을 제안합니다. MA 및 NA라고 부르 자고합니다. 클래스의 전체 API 표면이 공통 인터페이스로 덮여 있는지 확인하십시오. 공통 인터페이스는 3 번째 어셈블리 인 IA에 있어야합니다. 그런 다음 기본 응용 프로그램은 인터페이스 용 IA를 참조하고 Mono 또는 .NET에서 실행 중인지 여부에 따라 Reflection을 한 번만 사용하여 MA 또는 NA를로드하고 "최상위 팩토리 클래스"의 인스턴스를 가져옵니다. 일단 IA 인터페이스를 통해 일반 호출을 사용하면 해당 팩토리를 통해 다른 모든 객체를 인스턴스화하고 해당 객체를 사용합니다.

0

명령 줄 컴파일러 옵션에 참조를 추가하지 마십시오. 높은 수준의 IDE 도구를 사용하는 경우 같은 효과를 내기 위해 해당 프로젝트 설정으로 재생해야 할 수도 있습니다. AssemblyInfo.cs와 같이 작동하는 다른 파일이 있으며 고려중인 어셈블리에 대한 지침이 포함되어있을 수 있습니다. 또한 프로그램이 App.Config (구성 파일) 또는 Web.Config (ASP.NET)/동적 유형로드의 유형을 사용 중일 수 있습니다.

+0

Mono가 아닌 Visual Studio를 사용하여 컴파일 중입니다. – Fantius

0

코드가 JITted이고 코드가 JITted라는 사실에 의존하지 마십시오.

항상 참조되는 항목이로드되고 사용 가능해야한다는 것이 가장 좋습니다. 사용자는 Mono의 NGEN에 해당하는 AOT를 사용하도록 선택할 수 있습니다. 직렬화, 리모팅, 보안, 리플렉션 등과 같은 새로운 런타임 버전이 어떻게 처리되는지에 대한 미묘한 차이점은 코드에서 아무 것도 직접 사용하지 않아도 참조가로드 될 수 있음을 의미합니다. (그러나 serializer가 모든 유형을 가져 와서 다른 어셈블리를로드했을 수 있습니다.)

.Net 부분이 적절한 경우에만로드하기 위해 인터페이스 나 클래식 상속 또는 이벤트 나 다른 간접적 인 수단을 사용하십시오. 그리고 모자는 어셈블리를 참조하지 않고 동적으로로드하는 어셈블리를 의미합니다.

1

Pavel의 대답을 확장하면 플랫폼에 특정한 코드 비트를로드하는 조건을 도와주는 플러그인 프레임 워크를 사용할 수 있습니다. Mono.Addins 또는 MS 자체의 개방 소스 관리 확장 프레임 워크 (MEF) (http://www.codeplex.com/MEF)

관련 문제