Мы используем Tarma Installer для установки нашего Проекта, но в нем нет средств для установки GAC.
Поэтому мы создали нашу собственную утилиту, которая вызывается из установщика для выполнения установки Gac наших компонентов при необходимости.
Все это прекрасно работает для стандартных сборок (которые не требуют экспозиции в COM)
В моем коде есть следующий блок кода, который устанавливает сборку .Net 2 с подписью и предоставляет ряд интерфейсов для COM.
Dim a As System.Reflection.Assembly
Try
a = System.Reflection.Assembly.LoadFrom(p)
If codebase Then
rs.RegisterAssembly(a, Runtime.InteropServices.AssemblyRegistrationFlags.SetCodeBase)
Else
rs.RegisterAssembly(a, Runtime.InteropServices.AssemblyRegistrationFlags.None)
End If
Catch ex As Exception
If mDebug Then
MessageBox.Show(String.Format("Exception loading the type{3}Filename={0} {3}Mode={1} {3}CodeBase={2} {3}{4}", p, _
mode, codebase, Environment.NewLine, ex.ToString), "Exception Loading Assembly")
End If
End Try
, что приводит к следующему исключению
Exception loading the type
System.IO.FileLoadException: Mixed mode assembly is built against
version 'v1.1.4322' of the runtime and cannot be loaded in the 4.0 runtime
without additional configuration information.
at System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)
at System.Reflection.RuntimeAssembly.GetExportedTypes()
at System.Runtime.InteropServices.RegistrationServices.GetRegistrableTypesInAssembly(Assembly assembly)
at System.Runtime.InteropServices.RegistrationServices.RegisterAssembly(Assembly assembly, AssemblyRegistrationFlags flags)
at IdealBusinessSoftware.Utilities.Entry.Register(String p, String mode, Boolean codebase) in C:\Development\Utilities\GacManager4\Entry.vb:line 372
Я знаю, что размещение app.config со следующей информацией разрешает ситуацию
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
Есть ли правильный способ, которым я должен выполнять вызов, чтобы я не получил сообщение об ошибке и не использовал некоторые устаревшие настройки?