2012-04-02 6 views
1

Мы создаем плагин для программного обеспечения, которое было создано для .NET 3.5. В этом плагине мы ссылаемся на сторонний .DLL, который работает для .NET 3.5. Основное программное обеспечение теперь построено на .NET 4.0, а сторонний .DLL разделен на два .DLL.Assembly Resolve

Что мы хотим избежать, есть два отдельных решения с почти одинаковым кодом (один построен на .NET 4.0, ссылающийся на 4,0 DLL и один на 3.5, ссылающийся на 3,5 DLL). Не все наши клиенты собираются перейти на новейшую версию программного обеспечения, которое мы создаем плагины сразу, некоторые могут ждать лет.

ВОПРОС EDITED:

Есть ли способ, чтобы продолжать строить на .Net 3.5 ссылки на 3.5 DLL, а затем во время выполнения выполнить некоторые сборки решительность, чтобы загрузить два .NET 4.0 библиотеки DLL в месте первоначального?

Мы хотим/должны продолжать строить до рамки 3.5, чтобы предыдущие версии основного программного обеспечения продолжали загружать наш плагин. Если мы построим до 4.0, то более старые версии выдадут ошибку при попытке загрузить наш плагин, потому что его сборка в более позднюю структуру.

+1

Вы на самом деле пробовали это или вы просто догадываетесь, что может возникнуть проблема? Если вы это сделали, то, что * точно * является сообщением об ошибке? –

+0

Когда я пытаюсь загрузить плагин 4.0 с более старой версией программного обеспечения, я получаю следующие ошибки: Невозможно загрузить сборку. Сведения об ошибке: System.BadImageFormatException: не удалось загрузить файл или файл сборки: /// C: \ Users \ ******* \ Documents \ Visual Studio 2010 \ Projects \ RandomProjects \ A2013Testing \ bin \ Debug \ A2013Testing.dll 'или одну из его зависимостей. Эта сборка построена с использованием среды , новее, чем текущая загруженная среда выполнения, и ее нельзя загрузить. Имя файла: 'file: /// C: \ Users \ ******* \ Documents \ Visual Studio 2010 \ Projects \ RandomProjects \ A2013Testing \ bin \ Debug \ A2013Testing.dll' at System.Reflection. –

ответ

1

Данная сборка построена на время выполнения новее загруженной в данный момент времени выполнения

Это кристально чистый, ваш EXE загружен более раннюю версию CLR. Только версия .NET 4 CLR знает, как загрузить сборку, созданную для цели 4. Формат метаданных изменился на 4, старая CLR не знает, как ее прочитать.

Либо перестройте свой EXE для цели 4, либо укажите файл app.exe.config, который заставляет вашу программу работать с более новой версией CLR. Он должен выглядеть следующим образом: требуется

<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

Некоторые тестирования, .NET 4 является высокой степенью совместимости, но у него есть некоторые исправления, которые вы можете случайно положиться.

+0

Это не наш исполняемый файл, исполняемый файл пытается загрузить нашу DLL. Исполняемый файл построен с 4.0, а предыдущие исполняемые файлы - с 3.5. Мы пытаемся сделать нашу DLL совместимой с обоими. Исполняемый файл 4.0 будет загружать 3,5 DLL просто отлично, но наша 3.5 DLL должна ссылаться на ссылку сторонней версии 4.0 для этой версии и 3.5 DLL для более ранних версий. –

+0

Только EXE определяет, какая версия CLR будет загружена.Потому что он начинается первым. Если вы получите это исключение, вы можете быть уверены, что это проблема с EXE. И это было построено для целевой 3.5. Единственный способ загрузить все загруженные DLL 4.0 - заставить EXE загружать версию 4 CLR. Для этого требуется, чтобы она была построена для цели 4 или этого файла .exe.config. Вам, вероятно, нужно поговорить с владельцем EXE, чтобы разобраться в этом, возможно, они не будут довольны этим. –

0

Если структура точно такая же (на обеих сборках), нет проблемы с загрузкой библиотеки .NET 3.5 в среде выполнения .NET 4. (Я делаю это много в IronScheme, потому что я ленив на VS2010).

+0

Не уверен, что я был достаточно ясным, я редактировал вопрос. Благодарю. –