2016-06-07 1 views
0

Windows 용 경험이 풍부한 .NET 개발자이지만 안드로이드 용으로 Xamarin을 살펴보기 시작했습니다. 임 VS 2015 사용.Xamarin 응용 프로그램 컴파일. 어셈블리를로드하는 중 예외가 발생합니다. 파일을 찾을 수 없음 예외

내 Visual Studio 프로젝트에 DLL을 추가했습니다 (MyDll1.dll이라고 함). MyDll1.dll은 MyDll2.dll에 대한 몇 가지 종속성이 있습니다.

보통 Windows 솔루션의 경우 컴파일러는 MyDll1.dll을 참조하기 때문에 MyDll2.dll이 프로젝트에 추가되었는지 여부를 신경 쓰지 않습니다.

그러나 Xamarin에서 간단한 dll을 컴파일하려고하면 컴파일 할 때 오류가 발생합니다.

Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'MyDll2, Version=2.5.0.0, Culture=neutral, PublicKeyToken='. Perhaps it doesn't exist in the Mono for Android profile? 
File name: 'MyDll2.dll' 
    at Xamarin.Android.Tuner.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters) 
    at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(ICollection`1 assemblies, AssemblyDefinition assembly, Boolean topLevel) 
    at Xamarin.Android.Tasks.ResolveAssemblies.Execute() App1   

내가 문제를 제외하고 참조로 MyDll2.dll를 추가 할 수 있도록 그게 모두 잘

는 Mydll1.dll은 약 40 다른 DLL에 의존하고 있다는 점이다. 그리고 그 40 dll은 다른 dll 등에 의존합니다. 런타임은 모두 있지만 컴파일 타임에 정말로 필요합니까?

답변

1

어셈블리 및 해당 참조에 액세스 할 수 있습니다.

Xamarin의 컴파일러는 어셈블리를 연결하기 때문에 실제 파일이 필요하므로 메타 데이터와 IL을 제거 할 수 있습니다. 프로젝트 속성에서 링커를 사용하지 않도록 설정할 수는 있지만 JITted가 될 누락 된 어셈블리가 필요한 코드 경로를 사용하지 않는 한 실행할 수있는 훨씬 더 큰 응용 프로그램 패키지가됩니다. 또한 JITting은 Android 전용이므로 iOS에서는 작동하지 않습니다 (iOS 프로젝트는 해석 된 코드에 대한 Apple의 정책으로 인해 미리 연결됩니다).

Xamarin이 편집 및 패키징 단계에서 수행하는 흑 마법에 대해 잠깐 이야기 해 보겠습니다. 아주 오래전에, Xamarin의 기술이 원래 명명했던 MonoTouch/MonoDroid 팀은 공유 런타임에서 발생할 수있는 복잡성을 제거하기로 결정하여 런타임과 어셈블리를 앱의 패키지에 묶을 수 있도록했습니다 . 이로 인해 응용 프로그램 배포가 훨씬 단순 해졌음에도 불구하고 응용 프로그램 패키지의 크기가 폭발적으로 감소하는 부작용이있었습니다. 이 문제를 해결하기 위해 응용 프로그램에서 참조하는 어셈블리의 코드 사용을 분석하고 사용되지 않는 코드를 모두 트리밍하는 링커가 정말 멋진 기능을 개발했습니다. 실제로 사용하지 않는 코드/어셈블리는 패키지에서 생략되므로 앱의 크기가 상당히 줄어 듭니다. 그래도 컴파일러는 어셈블리를 처리해야합니다.