Здравствуйте, Serginio1, Вы писали:
ublic void RegisterExtensionAs(
[MarshalAs(UnmanagedType.BStr)]
ref String extensionName)
{
try
{
// initialize data members
nameToNumber = new Hashtable();
numberToName = new Hashtable();
numberToParams = new Hashtable();
numberToRetVal = new Hashtable();
propertyNameToNumber = new Hashtable();
propertyNumberToName = new Hashtable();
numberToMethodInfoIdx = new Hashtable();
propertyNumberToPropertyInfoIdx = new Hashtable();
// Заполнение хэш-таблиц
Type type = this.GetType();
Type[] allInterfaceTypes = type.GetInterfaces();
// Определение идентификатора
int Identifier = 0;
foreach(Type interfaceType in allInterfaceTypes)
{
if (
!interfaceType.Name.Equals("IDisposable")
&& !interfaceType.Name.Equals("IManagedObject")
&& !interfaceType.Name.Equals("IRemoteDispatch")
&& !interfaceType.Name.Equals("IServicedComponentInfo")
&& !interfaceType.Name.Equals("IInitDone")
&& !interfaceType.Name.Equals("ILanguageExtender")
)
{
// Обработка методов
MethodInfo[] interfaceMethods = interfaceType.GetMethods();
foreach (MethodInfo interfaceMethodInfo in interfaceMethods)
{
nameToNumber.Add(interfaceMethodInfo.Name, Identifier);
numberToParams.Add(Identifier,
interfaceMethodInfo.GetParameters().Length);
if (typeof(void) != interfaceMethodInfo.ReturnType)
numberToRetVal.Add(Identifier, true);
Identifier++;
}
// Обработка свойств
PropertyInfo[] interfaceProperties = interfaceType.GetProperties();
foreach (PropertyInfo interfacePropertyInfo in interfaceProperties)
{
propertyNameToNumber.Add(interfacePropertyInfo.Name, Identifier);
Identifier++;
}
}
}
foreach (DictionaryEntry entry in nameToNumber)
numberToName.Add(entry.Value, entry.Key);
foreach (DictionaryEntry entry in propertyNameToNumber)
propertyNumberToName.Add(entry.Value, entry.Key);
// Сохранение информации о методах класса
allMethodInfo = type.GetMethods();
// Сохранение информации о свойствах класса
allPropertyInfo = type.GetProperties();
// Отображение номера метода на индекс в массиве
foreach (DictionaryEntry entry in numberToName)
{
bool found = false;
for(int ii = 0; ii < allMethodInfo.Length; ii++)
{
if (allMethodInfo[ii].Name.Equals(entry.Value.ToString()))
{
numberToMethodInfoIdx.Add(entry.Key, ii);
found = true;
}
}
if (false == found)
throw new COMException("Метод не реализован ");
}
// Отображение номера свойства на индекс в массиве
foreach (DictionaryEntry entry in propertyNumberToName)
{
bool found = false;
for(int ii = 0; ii < allPropertyInfo.Length; ii++)
{
if (allPropertyInfo[ii].Name.Equals(entry.Value.ToString()))
{
propertyNumberToPropertyInfoIdx.Add(entry.Key, ii);
found = true;
}
}
if (false == found)
throw new COMException("The property is not implemented");
}
// Компонент инициализирован успешно
// Возвращаем имя компонента
extensionName = componentName;
}
catch (Exception)
{
return;
}
}
Основное обратить внимание на
Type type = this.GetType();
Type[] allInterfaceTypes = type.GetInterfaces();
То есть вы должны определить свои интерфейсы и определить методы в классе наследнике от Сомпонент.
Можно переопределить данный метот, путем внедрение своего класса без интефейсов, слегка переписав медод формирования Хэш таблицы методов и свойств.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>