Здравствуйте, Аноним, Вы писали:
А>День добрый.
А>Если кто нибудь создавал компоненту для 1С на C#, помогите разобраться плиз.
А>исходя из статьи http://www.rsdn.ru/article/dotnet/cs1c.xml, пробую компилировать библиотеку, не получаеться...
А>автор исходники не выложил, а у самого мозгов не хватает
А>Спасибо.
V Не смотрел внмательно, но по сути статья и есть исходники
public class Component : ServicedComponent,
IInitDone,
ILanguageExtender
{
}
все есть. Нужно только раставить переменные класса. И отнаследоваться
от Component. Да и такие языковые конструкции как
if (false == found) заменить на if (! found) шутка.
Желаю удачи.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
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>>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, abdula, Вы писали:
A>1С возвращает мне: A>Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует CLSD)
Обычно это сообщение о том что не нашла IInitDone.
Надо еще в ресурсах прописать http://soaron.fromru.com/vkhints.htm
например Component.RC и скомпилировать ее с проектом
STRINGTABLE DISCARDABLE
BEGIN
100 "Componenta"
END
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Обычно это сообщение о том что не нашла IInitDone. S> Надо еще в ресурсах прописать S>http://soaron.fromru.com/vkhints.htm S> например Component.RC и скомпилировать ее с проектом S> STRINGTABLE DISCARDABLE S>BEGIN
S> 100 "Componenta"
S>END
не хочет компилиться с этим ресурсом
пространство имен говорит не совпадает
S>> например Component.RC и скомпилировать ее с проектом S>> STRINGTABLE DISCARDABLE S>>BEGIN
S>> 100 "Componenta"
S>>END
A>не хочет компилиться с этим ресурсом A>пространство имен говорит не совпадает http://gzip.rsdn.ru/article/dotnet/resources.xml
Здравствуйте, <Аноним>, Вы писали:
А>День добрый.
А>Если кто нибудь создавал компоненту для 1С на C#, помогите разобраться плиз.
А>исходя из статьи http://www.rsdn.ru/article/dotnet/cs1c.xml, пробую компилировать библиотеку, не получаеться...
А>автор исходники не выложил, а у самого мозгов не хватает
А>Спасибо.
Если еще надо пиши на safonov(a)formula-it.ru пришлю работающую компоненту, написанную кажется на основании этой статьи.