2016-06-07 2 views
0

Я опытный разработчик .NET для Windows, но я просто начал изучать Xamarin для сборки для Android. Im using VS 2015.Компиляция приложения Xamarin. Исключение при загрузке сборок. Файл не найден Исключение

Я добавил DLL к моему проекту Visual Studio (назовем его MyDll1.dll) MyDll1.dll имеет некоторые зависимости от MyDll2.dll.

Обычно для решения Windows компилятор не заботится о том, было ли добавлено MyDll2.dll в проект или нет, потому что код просто ссылается на MyDll1.dll.

Однако, когда я попытался скомпилировать простую dll в Xamarin, она дает компиляцию с ошибкой.

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-only, он, вероятно, не будет работать под iOS (проекты iOS заранее связаны из-за политики Apple в отношении интерпретируемого кода).

Давайте поговорим о черной магии, которую Xamarin выполняет во время фазы компиляции и упаковки. Совсем давно MonoTouch/MonoDroid (это то, что технологии Xamarin были изначально названы) решили решить проблемы, которые возникли из общей среды выполнения, и сделали так, чтобы время выполнения и сборки были объединены в пакет приложения , Хотя это сделало развертывание приложений более простым, у него был отрицательный побочный эффект взрыва размера пакетов ваших приложений. Чтобы обойти это, они разработали действительно опрятную функцию: компоновщик, который анализирует использование кода в сборках, которые ссылаются на ваше приложение, и вырезает любой код, который не используется. На практике это приводит к значительному уменьшению размера вашего приложения, поскольку коды/сборки, которые вы никогда не используете, не указаны в пакете. Однако, чтобы иметь возможность это сделать, компилятор должен получить доступ к сборкам.

Смежные вопросы