Как оказалось, из-за того, что в пользовательском классе я не убивал один из объектов (а именно ТаблицаЗначений) метод Done() не срабатывал.
Вот пример компоненты на C# 2.0 для 1С 7.7 с получением и использованием 1С-оского класса:
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace AddIn
{
[Guid(@"AB634001-F13D-11D0-A459-004095E1DAEA"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IInitDone
{
void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection);
void Done();
void GetInfo([MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo);
}
[Guid("AB634004-F13D-11D0-A459-004095E1DAEA"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IAsyncEvent
{
void SetEventBufferDepth(Int32 depth);
void GetEventBufferDepth(ref Int32 depth);
void ExternalEvent([MarshalAs(UnmanagedType.BStr)] String source,
[MarshalAs(UnmanagedType.BStr)] String message,
[MarshalAs(UnmanagedType.BStr)] String data);
void CleanBuffer();
}
[ComVisible(true), ProgId(@"AddIn.ExcelReader"),
Guid(@"9F0CF3B4-B799-4852-8293-9BB9500A3099"),
ClassInterface(ClassInterfaceType.AutoDispatch)]
public class ExcelReader : IInitDone
{
public static Object pCon = new object();
public ExcelReader(){}
public void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection)
{
try
{
pCon = pConnection;
}
catch
{
throw new COMException(@"Unknown object context ");
}
}
public void Done()
{
}
public void Test()
{
object obj1C = pCon.GetType().InvokeMember("AppDispatch", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, pCon, null);
Object[] Args = new Object[1];
Args[0] = "ТаблицаЗначений";
object Object1C = obj1C.GetType().InvokeMember("CreateObject", BindingFlags.GetProperty, null, obj1C, Args);
Args[0] = "Должность";
Object1C.GetType().InvokeMember("НоваяКолонка", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, Args);
Args[0] = "Зарплата";
Object1C.GetType().InvokeMember("НоваяКолонка", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, Args);
Object1C.GetType().InvokeMember("НоваяСтрока", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, null);
Object1C.GetType().InvokeMember("УстановитьЗначение", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, new object[] { 1, "Должность", "Программер" });
Object1C.GetType().InvokeMember("ВыбратьСтроку", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, Object1C, null);
Marshal.Release(Marshal.GetIDispatchForObject(Object1C));
Marshal.ReleaseComObject(Object1C);
}
public void GetInfo([MarshalAs(UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo)
{
pInfo[0] = @"";
}
}
}