Как исправить ошибку COR_E_NEWER_RUNTIME при вызовах COM из Delphi: правильное указание версии CLR в манифесте сборки
Введение
При разработке программного обеспечения на Delphi, иногда возникают ситуации, когда необходимо вызвать COM-интерфейс, реализованный в сборке C# без её регистрации в системе. В таких случаях, если не соблюдены определенные условия, может возникнуть ошибка COR_E_NEWER_RUNTIME. В данной статье мы рассмотрим, как правильно указать версию CLR в манифесте сборки C# для корректной работы с Delphi.
Описание проблемы
Пользователь столкнулся с ошибкой COR_E_NEWER_RUNTIME при попытке создать COM-класс из сборки, скомпилированной с использованием технологии side-by-side. Это означает, что при вызове COM-интерфейса из Delphi-приложения, используется более новая версия CLR, чем та, которая поддерживается в данной ситуации.
Шаги решения проблемы
Проверка версии CLR: Убедитесь, что версия CLR, для которой скомпилирована сборка C#, соответствует версии, установленной на целевом компьютере.
Манифест сборки C#: В манифесте сборки C# должен быть указан элемент clrClass, который содержит атрибут runtimeVersion. Этот атрибут должен быть указан полностью и точно соответствовать версии CLR, используемой сборкой.
xml
<clrClass
clsid="{A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E}"
progid="TestSideBySide2"
threadingModel="Both"
name="TestSideBySide2.SideBySideClass"
runtimeVersion="v4.0.30319">
</clrClass>
Правильные значения runtimeVersion: Важно использовать правильные значения для атрибута runtimeVersion, например, v1.0.3705, v1.1.4322, v2.0.50727 или v4.0.30319.
Пример кода
Вот пример кода на Object Pascal (Delphi), который демонстрирует вызов COM-интерфейса:
program TestSideBySide2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
mscorlib_TLB in 'mscorlib_TLB.pas',
TestSideBySide2_TLB in 'TestSideBySide2_TLB.pas';
var
sideBySide : TestSideBySide2_TLB._SideBySideClass;
intfSideBySide : TestSideBySide2_TLB.ISideBySideClass;
res : HRESULT;
begin
try
sideBySide := TestSideBySide2_TLB.CoSideBySideClass.Create();
res := sideBySide.QueryInterface(IID_ISideBySideClass, intfSideBySide);
Writeln(intfSideBySide.Version());
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Заключение
Правильное указание версии CLR в манифесте сборки C# является ключевым моментом для успешного вызова COM-интерфейсов из Delphi. Следуя инструкциям и проверяя версию CLR, вы сможете избежать ошибки COR_E_NEWER_RUNTIME и обеспечить корректную работу вашего приложения.
В статье рассматривается проблема возникновения ошибки `COR_E_NEWER_RUNTIME` при попытке вызвать COM-интерфейс из сборки C# в приложении Delphi и даются инструкции по её устранению, включая корректное указание версии CLR в манифесте сборки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.