Как я могу предотвратить ссылки на определенную сборку при запуске в Mono - PullRequest
0 голосов
/ 28 октября 2009

Я знаю, как разветвлять код на основе Mono (Type.GetType ("Mono.Runtime")! = Null), но даже если выбран путь кода Mono, Mono пытается загрузить сборки, которые потребуются немоно кодовый путь. Это не так уж удивительно, но как мне обойти эту проблему? Я пытался передать вызов сборке non-Mono в другом классе, но это не помогло.

Ответы [ 4 ]

2 голосов
/ 28 октября 2009

Насколько я понимаю, единственная возможность сделать это напрямую - это Отражение полностью.

Я бы предложил более обходной подход: реорганизовать весь ваш код, который зависит от Mono или .NET, в отдельные сборки, по одной для каждой платформы - назовем их MA и NA. Убедитесь, что вся поверхность API ваших классов покрыта общими интерфейсами, которые должны быть в 3-й сборке, IA. После этого ваше основное приложение ссылается на IA для интерфейсов и использует Reflection только один раз, чтобы загрузить либо MA, либо NA, в зависимости от того, работает ли оно в Mono или .NET, и получить экземпляр «фабричного класса верхнего уровня». Оказавшись там, он просто использует обычные вызовы через интерфейсы IA для создания экземпляров всех других объектов через эту фабрику и работы с ними.

1 голос
/ 06 апреля 2010

Расширяя ответ Павла, вы можете использовать инфраструктуру плагинов, чтобы помочь с условием загрузки битов кода, специфичных для платформы. Вы можете использовать Mono.Addins или собственную открытую среду Managed Extensibility Framework с открытым исходным кодом, известную как MEF (http://www.codeplex.com/MEF)

0 голосов
/ 28 октября 2009

Не полагайтесь на свои зависимости от того, что ваш код является JITted, а этот только вызываемый код является JITted.

Лучше всего всегда предполагать, что все ссылки будут загружены и должны быть доступны. Ваш пользователь может использовать AOT, аналог Mono для NGEN. Или тонкие различия в том, как более новые версии времени выполнения обрабатывают такие вещи, как сериализация, удаленное взаимодействие, безопасность, отражение и т. Д., Могут привести к загрузке ссылок, даже если ваш код ничего не использует напрямую. (Но сериализатор мог вытянуть все типы, которые затем загружали другие сборки)

Используйте интерфейсы или классическое наследование, или, возможно, события или другие средства косвенного обращения, чтобы загружать части .Net только тогда, когда они уместны. И под шляпой я подразумеваю сборку, на которую вы не ссылаетесь, а загружаете динамически.

0 голосов
/ 28 октября 2009

Не добавляйте ссылку в параметрах компилятора командной строки. Если вы используете высокоуровневый инструмент IDE, то вам, возможно, придется поиграть с его настройками проекта, чтобы произвести то же самое. Есть и другие файлы, которые также входят в игру, например AssemblyInfo.cs, и могут содержать инструкции по сборкам, которые вы рассматриваете. Также программа может использовать типы из App.Config (файл конфигурации) или Web.Config (ASP.NET) / загрузка динамических типов.

...