.Net -> Delphi = property readonly ????
От: system_builder Россия  
Дата: 11.12.11 13:13
Оценка:
Подскажите ламеру в Com

Подскажите ламеру в Com

Извиняюсь, что задаю вопрос здесь. Тема — на стыке Delphi и C#, и при это я ни фига не знаю Com.

Создаю простой класс на C# — MyClass, с public методами и полями, ни от чего не наследованный. Все не нужное снаружи в этом классе делаю не public.

public MyClass : IMyClass
{
...
}

Ставлю в свойствах .Net проекта галку Make com visible и при сборке .Net автоматически создает для него интерфейс и MyClass.tlb.
В Delphi я делаю Inport Type Library выбирая сгенерированный tlb, который создает MyClass_tlb.pas и в нем много чего разного, в том числе класс TMyClass и интерфейс _MyClass.
Ну допустим тут все нормально, могу создать объект вызовом
CreateComObject(CLASS_MyClass) as _MyClass;
и использовать его.
Или использовать класс TMyClass.
Но вот беда — вот этот Delphi генератор все property делает readonly. В программе на Delphi приходится использовать методы Set_... сгенерированные этим генератором, например: Set_Property1(string Value).

Как сделать так, чтобы Delphi генератор делал property не readonly?
Может в C# коде надо какие-то атрибуты поставить для полей класса MyClass?

Я подумал, допустим я явно объявлю интерфейс IMyClass и скажу компилятору C# не создавать интерфейс автоматически. И размечтался, что это мне поможет.
Но не тут то было, стало еще хуже ))))

Класс MyClass объявляю так:

interface IMyClass
{
...
}

[ClassInterface(ClassInterfaceType.None)]
private MyClass : IMyClass
{
...
}

Тогда генератор Delphi создает только пустой интерфейс IMyClass, и в нем нет вообще ни одного метода ни одного property.

Как сделать так, чтобы генератор создавал весь интерфейс, и чтобы property получались не readonly.
Re: .Net -> Delphi = property readonly ????
От: HowardLovekraft  
Дата: 12.12.11 06:09
Оценка:
Здравствуйте, system_builder, Вы писали:

_>Как сделать так, чтобы генератор создавал весь интерфейс, и чтобы property получались не readonly.

У вас в пример интерфейс internal:

Only public types can be made visible. The attribute cannot be used to make an otherwise internal or protected type visible to COM or to make members of a nonvisible type visible.

Ну и в зависимости от того, какое связывание нужно, см. InterfaceTypeAttribute.
Re[2]: .Net -> Delphi = property readonly ????
От: system_builder Россия  
Дата: 12.12.11 16:14
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, system_builder, Вы писали:


_>>Как сделать так, чтобы генератор создавал весь интерфейс, и чтобы property получались не readonly.

HL>У вас в пример интерфейс internal:
HL>

HL>Only public types can be made visible. The attribute cannot be used to make an otherwise internal or protected type visible to COM or to make members of a nonvisible type visible.

HL>Ну и в зависимости от того, какое связывание нужно, см. InterfaceTypeAttribute.

Да, извиняюсь, не правильно пример привел, у меня в коде написано public interface.
В общем да, надо либо явно задавать интерфйейс, либо использовать AutoDual.
Я что-то вычитал где-то, что для .Net сборок мелкософт не делает writable свойства.
Но вот когда я явно задал guid для каждого интерфейса и для каждого класса реализующего этот интерфейс, и для каждого члена интерфейса сам руками задал dispid, тогда дурная Delphi создала все проперти writable, без ошибок. Оказалась другая проблема, что Delphi для set методов часто генерит просто Exit (выход с процедуры). Думаю это бага. Еще не пробовал на других версиях Delphi, мне надо для Delphi 6, так хочет заказчик.
И COM компонент надо создать именно на Net, потому, как надо юзать нетовский функционал и предоставить к нему доступ из этих старых дельфей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.