Как установить в GAC (и открыть для COM), когда установщик не поддерживает GacInstallation - PullRequest
1 голос
/ 06 декабря 2010

Мы используем 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>

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

...