как обновить раздел assemblyBinding в файле конфигурации во времени выполнения?

Согласно KEEP , который используется для обсуждения и планирования встроенных классов, в настоящее время это невозможно (по состоянию на 1.3.11):

Мы скомпилируем функция от compute(UInt) до compile-(Int), где - суффикс искажения для подписи. Теперь невозможно вызвать эту функцию из Java, потому что - там это недопустимый символ , но с точки зрения Котлина это обычная функция с именем compute. [Выделение мое]

blockquote>

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

9
задан Patrick Hofman 1 November 2017 в 08:37
поделиться

2 ответа

Лучшим способом я нашел для динамичной привязки с другой версией блока, должен сцепиться AppDomain.AssemblyResolve событие. Это событие запущено каждый раз, когда время выполнения не может определить местоположение точного блока, что приложение было связано против, и это позволяет Вам обеспечивать другой блок, который Вы загружаете сами в его месте (как долго, поскольку это совместимо).

Например, можно вставить статического конструктора на основном классе приложения, который сцепляет событие как это:

using System.Reflection;

static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs e)
    {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "AssemblyNameToRedirect")
        {
            // Put code here to load whatever version of the assembly you actually have

            return Assembly.LoadFrom("RedirectedAssembly.DLL");
        }
        else
        {
            return null;
        }
    };
}

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

19
ответ дан 4 December 2019 в 09:14
поделиться

RuntimeSection файла конфигурации обновляют во времени выполнения с помощью этого кода:

private void ModifyRuntimeAppConfig()
{
  XmlDocument modifiedRuntimeSection = GetResource("Framework35Rebinding");

  if(modifiedRuntimeSection != null)
  {
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    ConfigurationSection assemblyBindingSection = config.Sections["runtime"];

    assemblyBindingSection.SectionInformation.SetRawXml(modifiedRuntimeSection.InnerXml);
    config.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection("runtime");
  }
}

с Framework35Rebinding, содержащим:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/>
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.CompactFramework.Build.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="9.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

и app.config, содержащий (перед осуществлением программы):

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
  <runtime>
  </runtime>
</configuration>

Тем не менее, это не работает на это, я хочу сделать, потому что assemblyBinding только читается при запуске приложения тогда как RefreshSection("runtime")

3
ответ дан 4 December 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: