Параметры IDispatch передаются из Delphi в C # - PullRequest
0 голосов
/ 01 июня 2010

Я использую 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.

Любые мысли, предложения будут с благодарностью.

Ответы [ 2 ]

1 голос
/ 01 июня 2010

Здравствуйте, Джейсон, посмотрите эту статью Создание пользовательской реализации маршалинга возможно, это даст вам ключ к решению проблемы, которую вы пытаетесь решить.

1 голос
/ 01 июня 2010

CLR не будет знать, что делать с необработанным указателем интерфейса и без информации о типе. Вам нужно будет передать VARIANT типа VT_DISPATCH. Это отобразится на __ComObject на стороне C #, для выполнения вызовов по этой ссылке требуется поздняя привязка.

...