我在DLL(该代码显示在从元数据中的Visual Studio)此接口:
#region Assembly XCapture.dll, v2.0.50727
// d:\svn\dashboard\trunk\Source\MockDiagnosticsServer\lib\XCapture.dll
#endregion
using System;
using System.Runtime.InteropServices;
namespace XCapture
{
[TypeLibType(4160)]
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
public interface IDiagnostics
{
[DispId(1)]
void GetStatusInfo(int index, ref object data);
}
}
所以,我创建了这样一个类的COM服务器:
[ComVisible(true)]
[Guid(SimpleDiagnosticsMock.CLSID)]
[ComDefaultInterface(typeof(IDiagnostics))]
[ClassInterface(ClassInterfaceType.None)]
public class SimpleDiagnosticsMock : ReferenceCountedObject, IDiagnostics
{
public const string CLSID = "281C897B-A81F-4C61-8472-79B61B99A6BC";
// These routines perform the additional COM registration needed by
// the service. ---- stripped from example
void IDiagnostics.GetStatusInfo(int index, ref object data)
{
Log.Info("GetStatusInfo called with index={0}, data={1}", index, data);
data = index.ToString();
}
}
服务器似乎做工精细,我能够使用对象从一个VBScript。 但后来我尝试从另一个C#客户端使用它:
[STAThread]
static void Main(string[] args)
{
Guid mockClsId = new Guid("281C897B-A81F-4C61-8472-79B61B99A6BC");
Type mockType = Type.GetTypeFromCLSID(mockClsId, true);
IDiagnostics mock = (IDiagnostics)Activator.CreateInstance(mockType);
//var diag = mock as IDiagnostics;
object s = null;
mock.GetStatusInfo(3, ref s);
Console.WriteLine(s);
Console.ReadKey();
}
而它失败
无法转换类型的COM对象“系统.__ ComObject”到接口类型“XCapture.IDiagnostics”。 此操作失败的原因是对IID“{XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXX}”的界面处的COM组件调用QueryInterface失败,因为以下错误:不支持此接口(从HRESULT异常:0x80004002(E_NOINTERFACE)) 。
我究竟做错了什么?
我也曾尝试使用InvokeMember,除我是不是能够得到裁判,返回的数据参数还挺奏效。
编辑:添加STAThread属性来我的主要程序。 这并没有解决问题,但你除非你绝对相信你不需要它真的应该使用STAThread与COM。 见下面汉斯帕桑特的答案。