모노 (Type.GetType ("Mono.Runtime")! = null)를 기반으로 코드를 분기하는 방법을 알고 있지만 모노 코드 경로가 Mono가 Mono가 아닌 코드 경로에 필요한 어셈블리를로드하려고 시도하고 있습니다. 이 모든 것이 놀라운 것은 아니지만 문제를 해결하려면 어떻게해야합니까? 다른 클래스의 Mono가 아닌 어셈블리에 대한 호출을 시도했지만 시도가 도움이되지 않았습니다.모노에서 실행할 때 특정 어셈블리 참조를 방지하려면 어떻게해야합니까?
답변
직접 볼 수있는 유일한 방법은 Reflection입니다.
저는 원형 또는 .NET에 의존하는 모든 코드를 각 플랫폼마다 별도의 어셈블리로 리팩토링하는 방식을 제안합니다. MA 및 NA라고 부르 자고합니다. 클래스의 전체 API 표면이 공통 인터페이스로 덮여 있는지 확인하십시오. 공통 인터페이스는 3 번째 어셈블리 인 IA에 있어야합니다. 그런 다음 기본 응용 프로그램은 인터페이스 용 IA를 참조하고 Mono 또는 .NET에서 실행 중인지 여부에 따라 Reflection을 한 번만 사용하여 MA 또는 NA를로드하고 "최상위 팩토리 클래스"의 인스턴스를 가져옵니다. 일단 IA 인터페이스를 통해 일반 호출을 사용하면 해당 팩토리를 통해 다른 모든 객체를 인스턴스화하고 해당 객체를 사용합니다.
명령 줄 컴파일러 옵션에 참조를 추가하지 마십시오. 높은 수준의 IDE 도구를 사용하는 경우 같은 효과를 내기 위해 해당 프로젝트 설정으로 재생해야 할 수도 있습니다. AssemblyInfo.cs와 같이 작동하는 다른 파일이 있으며 고려중인 어셈블리에 대한 지침이 포함되어있을 수 있습니다. 또한 프로그램이 App.Config (구성 파일) 또는 Web.Config (ASP.NET)/동적 유형로드의 유형을 사용 중일 수 있습니다.
코드가 JITted이고 코드가 JITted라는 사실에 의존하지 마십시오.
항상 참조되는 항목이로드되고 사용 가능해야한다는 것이 가장 좋습니다. 사용자는 Mono의 NGEN에 해당하는 AOT를 사용하도록 선택할 수 있습니다. 직렬화, 리모팅, 보안, 리플렉션 등과 같은 새로운 런타임 버전이 어떻게 처리되는지에 대한 미묘한 차이점은 코드에서 아무 것도 직접 사용하지 않아도 참조가로드 될 수 있음을 의미합니다. (그러나 serializer가 모든 유형을 가져 와서 다른 어셈블리를로드했을 수 있습니다.)
.Net 부분이 적절한 경우에만로드하기 위해 인터페이스 나 클래식 상속 또는 이벤트 나 다른 간접적 인 수단을 사용하십시오. 그리고 모자는 어셈블리를 참조하지 않고 동적으로로드하는 어셈블리를 의미합니다.
Pavel의 대답을 확장하면 플랫폼에 특정한 코드 비트를로드하는 조건을 도와주는 플러그인 프레임 워크를 사용할 수 있습니다. Mono.Addins 또는 MS 자체의 개방 소스 관리 확장 프레임 워크 (MEF) (http://www.codeplex.com/MEF)
- 1. 모노에서 어셈블리 리디렉션을 하시겠습니까?
- 2. csc/mcs가 특정 버전의 어셈블리 참조를 사용하도록하려면 어떻게해야합니까?
- 3. 특정 보고서를 실행할 때
- 4. SVN에서 특정 디렉토리의 체크 아웃을 방지하려면 어떻게해야합니까?
- 5. 요소에 패딩이있을 때 깜박임 현상을 방지하려면 어떻게해야합니까?
- 6. Maven 어셈블리 실행 특정 표현식을 어셈블리 디스크립터 파일에 포함하려면 어떻게해야합니까?
- 7. 자동 회전을 방지하려면 어떻게해야합니까?
- 8. 재생 공격을 방지하려면 어떻게해야합니까?
- 9. 모노에서 JSON 라이브러리 사용
- 10. 사용자가 특정 양식을 페이지에서 나가는 것을 방지하려면 어떻게해야합니까?
- 11. 페이지 다운과 같은 특정 이벤트에서 JScrollBar가 스크롤되는 것을 방지하려면 어떻게해야합니까?
- 12. [데이터베이스] 명령 사용을 방지하려면 어떻게해야합니까?
- 13. 버튼 대신 앵커를 사용할 때 버튼 매싱을 방지하려면 어떻게해야합니까?
- 14. Doctrine이 특정 테이블에 대해 SQL을 생성하는 것을 방지하려면 어떻게해야합니까?
- 15. 어셈블리 프로그램을 실행할 수 없습니다.
- 16. 어셈블리 참조를 대상 새 버전으로 업데이트
- 17. 모노에서 Emscripten
- 18. 선택기없이로드 할 때 iPhone의 특정 사진에 대한 참조를 저장하려면 어떻게합니까?
- 19. ASP.NET MVC에서 JSON 직렬화를 방지하려면 어떻게해야합니까?
- 20. 이 메모리 경고를 방지하려면 어떻게해야합니까?
- 21. JavaScript에서 기본 동작을 방지하려면 어떻게해야합니까?
- 22. 본문에서 선택 스크롤을 방지하려면 어떻게해야합니까?
- 23. 코드의 HTML 인코딩을 방지하려면 어떻게해야합니까?
- 24. FormView에서 HTML 인코딩을 방지하려면 어떻게해야합니까?
- 25. TextView에서 스 와이프를 방지하려면 어떻게해야합니까?
- 26. 특정 조건이 충족 될 때 C++ 템플릿 클래스 메서드의 인스턴스화를 방지하려면 어떻게해야합니까?
- 27. UITableViewCellStyleValue1을 사용할 때 textLabel이 잘리는 것을 방지하려면 어떻게해야합니까?
- 28. Tomcat에 메모리가 부족할 때 앤트 태스크가 멈추는 것을 방지하려면 어떻게해야합니까?
- 29. TableLayoutPanel에서 크기를 조정할 때 시각적으로 뒤떨어지는 컨트롤을 방지하려면 어떻게해야합니까?
- 30. intValue를 원할 때 실수로 NSNumber의 포인터를 사용하는 것을 방지하려면 어떻게해야합니까?
Mono가 아닌 Visual Studio를 사용하여 컴파일 중입니다. – Fantius