#c# #.net #vb6 #com-interop
#c# #.net #vb6 #com-взаимодействие
Вопрос:
Я пытаюсь имитировать старую библиотеку dll vb6 с помощью новой .net. Имитация должна быть идеальной, чтобы вызывающие пользователи не знали, что они используют новую .dll.
Однако у меня есть любопытство. В VB6 в библиотеке объектов есть следующее:
Property BankList(Index As Long) As String
Но AFAIK property это невозможно сделать в .net?
Самое близкое, что я могу получить, — это создать функцию, которая демонстрирует такое поведение, но затем тип COM переходит из свойства в метод.
Кто-нибудь может подсказать, как я мог бы создать эту подпись с помощью свойства?
Комментарии:
1. Кстати, не существует такой вещи, как C#.NET . Язык называется «C #».
Ответ №1:
Вы можете украсить обычный индексатор IndexerNameAttribute
атрибутом, чтобы предоставить ему имя для других языков. Однако я не уверен, достигнет ли это вашей цели.
К сожалению, C # поддерживает только вызов именованных индексаторов как часть COM-взаимодействия, не существует поддерживаемого языкового способа реализации вашего собственного (т. Е. класс может иметь только индексатор по умолчанию с IndexerNameAttribute
атрибутом).
Вы можете создать нечто похожее для вызывающих C # пользователей, внедрив тип с помощью индексатора, а затем получив свойство этого типа, но оно не соответствует в точности нужному вам эквиваленту VB6.
Смотрите также: Использование индексаторов (C #)
В сторону
Как упоминалось в других ответах, хотя C # не поддерживает именованные индексаторы, .NET CLR и некоторые другие языки, такие как VB.NET, делаем. Возможно, вы захотите рассмотреть возможность изменения вашего целевого языка, чтобы получить эту функцию.
Ответ №2:
Согласно http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx вы не можете объявлять индексированные свойства в C #. Однако, в отличие от того, что указано в некоторых других ответах, среда CLR действительно поддерживает их, и вы можете объявить их в VB.NET .
Ответ №3:
Именованные параметризованные свойства не могут быть созданы на C # (доступно только одно свойство по умолчанию, called this
).
Существует несколько вариантов:
- Измените интерфейс (но это упускает главное, поскольку клиентский код необходимо будет изменить).
- Используйте VB (.net), который может создавать такие свойства.
- Создайте адаптер на C , чтобы предоставить полный контроль на уровне COM.
Первое означало бы изменение интерфейса, что нарушает ваши требования. Последний вариант обеспечивает наибольший контроль, но значительно сложнее (если вы еще не знакомы с разработкой COM на C ). Я бы выбрал VB.NET .
Комментарии:
1. К этому следует добавить еще один момент. Если вы намерены использовать C #, вы могли бы создать свою dll на C #, используя любые возможности, которые у нее есть, но затем написать небольшую «оболочку» в vb, которая поддерживает именованные параметризованные свойства и просто передает вызов в код C #. Таким образом, вы сохраняете совместимость, но при этом получаете весь новый код на C #. Лично я предпочитаю VB, поэтому, скорее всего, просто сделаю это на VB, но если вы (или команда) предпочитаете C #, это, безусловно, вариант.
Ответ №4:
Индексированные свойства доступны в .Net / C #, но вы не можете дать им имена:
public String this[long index]
{
get; set;
}
Это создает свойство с именем Item
, но вы не используете это имя в C#:
myObj[1L];
Если вы хотите вызвать именованное свойство в COM с C # 4.0, вы можете:
excel.Range["a"];
http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx
Наконец, если вы хотите, чтобы индекс имел имя для языков COM, вы можете использовать атрибут IndexerNameAttribute, чтобы представить индексатор как именованное свойство.