Здравствуйте. Столкнулся с проблемой получения интерфейса через ActiveX. При вызове GetActiveObject(..) возвращает объект типа System.__ComObject. При приведении его к типу интерфейса возвращает null. Вот описание Co-класса:
[ComVisible( true )]
[Guid( "038d06d2-3e93-40cd-9507-c5e2f227afdd" )]
[InterfaceType( ComInterfaceType.InterfaceIsDual )]
public interface ITextProvider
{
[DispId( 1 )]
void SetText( string Text );
[DispId( 2 )]
string GetText();
}
[ComVisible( true )]
[InterfaceType( ComInterfaceType.InterfaceIsIDispatch )]
[Guid( "e5e3ada1-267c-4ac4-a0f9-2e5222281959" )]
public interface ITextProviderEvents
{
[DispId( 1 )]
void TextChanged( string Text );
}
public delegate void TextDelegate( string Text );
[ComVisible( true )]
[ComSourceInterfaces( typeof( ITextProviderEvents ) )]
[ClassInterface( ClassInterfaceType.None )]
[Guid( "f7b960be-0b48-43de-b5ce-c43a07d051ef" )]
[ProgId( "ComLib.CoTextProvider" )]
[ComDefaultInterface( typeof( ITextProvider ) )]
public class CoTextProvider : ITextProvider, IDisposable
{
public event TextDelegate TextChanged;
private string m_sText;
private int m_iRegister = 0;
private bool m_bDisposed = false;
public CoTextProvider()
{
Guid guid = Marshal.GenerateGuidForType( typeof( ComLib.CoTextProvider ) );
var i = Ole32.RegisterActiveObject( this, ref guid, 0, out m_iRegister );
}
public void SetText( string Text )
{
this.m_sText = Text;
var h = this.TextChanged;
if( h != null )
{
try
{
h( Text );
}
catch( Exception ex )
{
System.Diagnostics.Trace.TraceError( string.Format( "Exception: {0}", ex.Message ) );
}
}
}
public string GetText()
{
return this.m_sText;
}
public void Dispose()
{
if( this.m_bDisposed )
{
return;
}
if( this.m_iRegister != 0 )
{
try
{
IBindCtx bc;
ComLib.Ole32.CreateBindCtx( 0, out bc );
IRunningObjectTable rot;
bc.GetRunningObjectTable( out rot );
rot.Revoke( m_iRegister );
m_iRegister = 0;
}
catch { }
}
this.m_bDisposed = true;
}
}
Соответственно, запускается сервер (WinForms-приложение), инстанцирующий данный объект и клиент (тоже WinForms), пытающийся к нему подключиться и получаю вышесказанное. Подскажите, может я что-то забыл или не так сделал. Как получить на клиенте после вызова GetActiveObject ссылку на объект типа CoTextProvider?