Проблема с явным преобразованием интерфейсов
От: close_os  
Дата: 25.11.06 07:32
Оценка:
Здравствуйте.

Имеются следующие интерфейсы:

[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 System.Array info);
}

[Guid("ab634004-f13d-11d0-a459-004095e1daea"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IAsyncEvent
{
void SetEventBufferDepth(int lDepth);
void GetEventBufferDepth(ref int plDepth);
void ExternalEvent(string bstrSource, string bstrMessage, string bstrData);
void CleanBuffer();
}

[Guid("3127CA40-446E-11CE-8135-00AA004BB851"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IErrorLog
{
void AddError(string pszPropName, ref ExcepInfo pExepInfo);
}

[Guid("ab634005-f13d-11d0-a459-004095e1daea"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IStatusLine
{
void SetStatusLine(string bstrStatusLine);
void ResetStatusLine();
}

Также имеется класс:

public class V7Data
{
public static object V7Object
{
get
{
return m_V7Object;
}
set
{
m_V7Object = value;

//----------------------------------------------------------------
//вот тут говорят происходит неявный вызов Marshal.QueryInterface

m_ErrorInfo = (IErrorLog)value;
m_AsyncEvent = (IAsyncEvent)value;
m_StatusLine = (IStatusLine)value;
}
}

public static IErrorLog ErrorLog
{
get
{
return m_ErrorInfo;
}
}

public static IAsyncEvent AsyncEvent
{
get
{
return m_AsyncEvent;
}
}

public static IStatusLine StatusLine
{
get
{
return m_StatusLine;
}
}


private static object m_V7Object;
private static IErrorLog m_ErrorInfo;
private static IAsyncEvent m_AsyncEvent;
private static IStatusLine m_StatusLine;

}

В функции IInitDone.Init() делаем следующее:

void Init([MarshalAs(UnmanagedType.IDispatch)] object pConnection)
{
V7Data.V7Object=pConnection;
}


Пожалуйста подскажите, как выполнить явное преобразование.

Объясню, для чего мне это нужно. Этот код, как многие может узнали, часть шаблона внешней компоненты 1С. Ситуация следующая: код компоненты создает новый поток, в котором вызывается V7Data.AsyncEvent.ExternalEvent(), что приводит к исключению System.InvalidCastException: QueryInterface for interface IAsyncEvent failed. Причем, если то же самое вызвать из основного потока компоненты, все работает. Возможно перевод кода на явное преобразование не есть правильное решение, если кто сталкивался или знает в чем дело, просветите.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.