Согласно KEEP , который используется для обсуждения и планирования встроенных классов, в настоящее время это невозможно (по состоянию на 1.3.11):
Мы скомпилируем функция от
blockquote>compute(UInt)
доcompile-
, где(Int) - суффикс искажения для подписи. Теперь невозможно вызвать эту функцию из Java, потому что - там это недопустимый символ , но с точки зрения Котлина это обычная функция с именем compute. [Выделение мое]
Имейте в виду, что встроенные классы являются экспериментальными и могут быть изменены, поэтому, возможно, в будущем выпуске это будет возможно. Я попытался аннотировать это с помощью @JvmName, и это также не поддерживается.
Лучшим способом я нашел для динамичной привязки с другой версией блока, должен сцепиться 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;
}
};
}
Этот метод избегает потребности иметь дело с привязками сборки в конфигурационных файлах и немного более гибок с точки зрения того, что можно сделать с ним.
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")