2009-11-12 4 views
0

У меня есть приложение, которое должно работать с двумя версиями dll. Я решил, что просто буду компилировать приложение один раз, скопировать exe в два каталога, а затем скопировать две версии DLL в каждый из этих каталогов. FYI, я ничего не делаю с GAC. Тем не менее, я получаю исключение FileLoadException в версии с dll, с которой он не был скомпилирован.FileLoadException с новой версией dll

В проекте у меня есть «Специфическая версия», равная false для ссылки dll. Но, возможно, это неправильная настройка. Как мне заставить это работать с несколькими версиями?

ответ

0

Я решил не изменять конфигурационный файл, просто потому, что мне нужно было это сделать. Что касается изменения адреса для разных версий dll, я не думаю, что у меня есть эта проблема, так как я фактически использую интерфейс для вызова моих методов.

Чтобы дать немного более подробную информацию, мне просто нужно создать экземпляр одного типа в нескольких dll. Оттуда я рассматриваю его как объект интерфейса. Итак, вот мое решение:

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll"); 
Type type = asm.GetType("MyType"); 
IMyType obj = Activator.CreateInstance(type) as IMyType; 

Это похоже на работу.

2

Если сборка, на которую вы ссылаетесь, строго подписана, CLR не загрузит ее, если она отличается от версии, с которой она была скомпилирована. Вы могли бы в этом случае использовать конфигурационный файл, чтобы указать версию, которую вы хотели бы использовать:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
      <assemblyIdentity name="YouAssemblyNameWithoutDotDll" 
           publicKeyToken="your-assembly-token" 
           culture="neutral" /> 
      <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Конечно, это предполагает, что новая версия сборки имеет те же сигнатуры методов или вы получите MissingMethodException во время выполнения ,

0

Это потому, что каждый раз, когда вы перекомпилируете dll, изменяются адреса функций. И поскольку вы привязываете свое приложение к времени компиляции с вашей dll, эти адреса устанавливаются в вашем приложении. В основном вы должны перекомпилировать свою программу каждый раз с новой версией dll (или, точнее, когда вы возитесь с datastructures) или используете динамическую загрузку и GetProcAddress.

0

Убедитесь, что две версии сборки имеют одинаковую AssemblyVersion, указанную в файле AssemblyInfo.cs.

Ex:

[assembly: AssemblyVersion("1.0.0.0")] 

Я считаю, что по умолчанию создается для новых проектов, прежде чем VS 2008 является:

[assembly: AssemblyVersion("1.0.0.*")] 

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

Это особенно важно для assemblies that are signed, так как сильное имя сборки включает его версию.

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