Я использую Delphi 2010 для доступа к объектам, хранящимся в сборке C #, написанной в Visual Studio 2008, используя методы, описанные в Hosting CLR в Delphi . Эти методы работают, и я могу получить экземпляр класса .NET - через интерфейс - и вызвать его методы и прочитать его свойства. Вызов методов работает нормально до тех пор, пока параметры являются простыми параметрами, такими как строки, целые числа, символы и логические значения. Но если я попытаюсь передать параметр, который является ссылкой на IDispatch, код C # / .NET воспринимает параметр только как нулевое значение.
Единственное отличие от CLR хостинга в примере Delphi состоит в том, что я не определяю интерфейсы в Delphi и C # вручную. Вместо этого я пишу библиотеку типов интерфейса в виде файла RIDL в Delphi 2010. Затем я компилирую этот файл RIDL в файл TLB, затем использую TLBIMP.EXE от Microsoft для создания библиотеки DLL COM / Interop из библиотеки DLL, а затем добавляю ссылку к этой DLL в проекте C #. Я использую этот подход для определения интерфейсов COM-объектов, которые я использую как для использования интерфейса (как описано в Hosting CLR в Delphi), так и для определения интерфейса интерфейса IDispatch, который я передаю в качестве параметра.
Вот интерфейс, который я использую из Delphi, и тот, который используют классы C #, которые я использую (Метаданные .NET):
[TypeLibType(4160)]
[Guid("C4D342E4-62A0-4049-BF1E-9F2A6EE19E5E")]
public interface ITestInterface
{
[DispId(203)]
int Run(object Test);
}
Delphi может запустить CLR, а затем создать объект C #, который реализует ITestInterface. Delphi может вызвать Run, и я могу убедиться, что Run выполняется правильно. Возвращаемые значения соответствуют ожидаемым, и если я передам параметры, отличные от «Теста объекта» (переписать интерфейс), то эти параметры будут правильно видны. Но когда я передаю ссылку на объект IDispatch для интерфейса Test, код C # видит его только как NULL. Попытка привести параметр с использованием «as» к нужному интерфейсу не дает сбоя - но это приводит к NULL, потому что начальное значение кажется NULL.
Я дважды проверил, и значение не равно NULL, когда оно покидает Delphi.
Я предполагаю, что есть какой-то дополнительный шаг маршаллинга, который я должен выполнить на стороне C #, чтобы правильно получить интерфейс, поддерживаемый объектом IDispatch.
Любые мысли, предложения будут с благодарностью.