Использования объектов DotNet в коде СОМ, проблемы производительности
Если вы купили диск с DotNet:
1. Регистрация сборки DotNet
Т.е. в реестр надо добавить соответствующие сведенья. Для этого можно воспользоваться или специальным методом System.Runtime.Interop.Service.RegistrationServices. Есть специальная утилита для регистрации RegamDotNetAssembly.dll.
2. Автоматизация позднего связывания
После регистрации к коду DotNet можно обращаться с помощью вариантной переменной, которая имеет полное право для жизнь в СОМ технологии.
Например, как только сведения в реестре появились:
Var dNetObject:Variant;
dNetObject:=CreateOleObject(‘dotNetAssembly.dotNetClassForBin’);
Конечно, желательно ограничить типы данных, поскольку несовместимость и в эту сторону остается. Т.к. в среде СОМ типов данных меньше, чем в DotNet.
3. Библиотека типов совместимости
Для ранее связывание необходима библиотека типов, которая позволяла использовать во время компиляции в среде СОМ интерфейсы класса, описанные в библиотеки типов. Для этих целей можно использовать библиотеку типов, которую среда CLR создает во время выполнения именно для этих целей. Её по сути и называют библиотекой типов совместимости функций неуправляемого кода из dll. Delphi for Net поддерживает традиционный синтаксис объявления импорта из библиотек dll Win32. Однако здесь необходимо указывать так называемые атрибуты [dllImport]. Среда Delphi поставляется в комплекте с несколькими модулями импорта, в т.ч. содержащие модули импорта PInvoke.
Проблемы производительности
В Delphi есть специальные модули, которые совместимость эту обеспечивают. За любое обращение к среде PInvoke приходиться платить прежде всего производительностью. Передача данных из одной надоперационную среду в другую надоперационную среду нужно за это заплатить временем, не говоря уже о коде.
Для оптимизации затрат нужно:
1. Маршилинг тем эффективнее, чем он короче. Т.е. следует избегать маршалинга строк. Желательно подсказывать маршулезатору типа параметров по возможности. Т.е. in или out, чтобы не гоняли параметры туда сюда.
2. В избежание задержки при загрузки dll перед первым обращением к функциям PInvoke можно использовать специальную функцию Marshal. Prilink. Т.е. вы фактически даете среде CLR сигнал о том, что будет специальное связывание во время выполнения.