|
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.ServiceModel.ComIntegration
{
using System;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Services;
class MonikerBuilder : IProxyCreator
{
ComProxy comProxy;
MonikerBuilder()
{
}
void IDisposable.Dispose()
{
}
ComProxy IProxyCreator.CreateProxy(IntPtr outer, ref Guid riid)
{
if ((riid != typeof(IMoniker).GUID) && (riid != typeof(IParseDisplayName).GUID))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidCastException(SR.GetString(SR.NoInterface, riid)));
if (outer == IntPtr.Zero)
{
throw Fx.AssertAndThrow("OuterProxy cannot be null");
}
if (comProxy == null)
{
ServiceMonikerInternal moniker = null;
try
{
moniker = new ServiceMonikerInternal();
comProxy = ComProxy.Create(outer, moniker, moniker);
return comProxy;
}
finally
{
if ((comProxy == null) && (moniker != null))
((IDisposable)moniker).Dispose();
}
}
else
return comProxy.Clone();
}
bool IProxyCreator.SupportsErrorInfo(ref Guid riid)
{
if ((riid != typeof(IMoniker).GUID) && (riid != typeof(IParseDisplayName).GUID))
return false;
else
return true;
}
bool IProxyCreator.SupportsDispatch()
{
return false;
}
bool IProxyCreator.SupportsIntrinsics()
{
return false;
}
public static MarshalByRefObject CreateMonikerInstance()
{
IProxyCreator serviceChannelBuilder = new MonikerBuilder();
IProxyManager proxyManager = new ProxyManager(serviceChannelBuilder);
Guid iid = typeof(IMoniker).GUID;
IntPtr ppv = OuterProxyWrapper.CreateOuterProxyInstance(proxyManager, ref iid);
MarshalByRefObject ret = EnterpriseServicesHelper.WrapIUnknownWithComObject(ppv) as MarshalByRefObject;
Marshal.Release(ppv);
return ret;
}
}
}
|