Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# InvalidCastException,COM组件上的QueryInterface调用失败_C#_Com_Ole_Queryinterface - Fatal编程技术网

C# InvalidCastException,COM组件上的QueryInterface调用失败

C# InvalidCastException,COM组件上的QueryInterface调用失败,c#,com,ole,queryinterface,C#,Com,Ole,Queryinterface,我正在尝试在我目前正在开发的.net应用程序中使用PCAnywhere的Ole自动化(VS2010,c#)。PCA 12.5附带了两个tlb文件,当我试图通过VS添加为引用时,两个文件都出现了一个错误,即“无法添加对E:\Dev\PcaOle\awrem32.tlb的引用”。请确保该文件是可访问的,并且是有效的程序集或COM组件',因此我所做的是使用tlbimp.exe生成互操作程序集,并将创建的DLL作为引用导入。没有问题。好啊 以下是我到目前为止的一些代码: Thread pcat = ne

我正在尝试在我目前正在开发的.net应用程序中使用PCAnywhere的Ole自动化(VS2010,c#)。PCA 12.5附带了两个tlb文件,当我试图通过VS添加为引用时,两个文件都出现了一个错误,即“无法添加对E:\Dev\PcaOle\awrem32.tlb的引用”。请确保该文件是可访问的,并且是有效的程序集或COM组件',因此我所做的是使用tlbimp.exe生成互操作程序集,并将创建的DLL作为引用导入。没有问题。好啊 以下是我到目前为止的一些代码:

Thread pcat = new Thread(delegate()
{
    CRemoteDataManagerClass mng = new CRemoteDataManagerClass();
    RemoteDataExClass data = null;
    data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);
    if (data == null)
        data = (RemoteDataExClass)mng.CreateObjectEx("temp.chf");
    data.ConnectionType = "TCP/IP";
    data.PhoneNumber = host.IP;
    data.AutoLoginName = host.Nombre.StartsWith("WS") ? "usrwksvc" : "admonadn";
    data.AutoDomain = "dom" + actual.numec.PadLeft(4, '0');
    data.WriteProtection = false;
    data.WriteObject(null);
    AWREM32.Document doc = new AWREM32.Document();
});
pcat.SetApartmentState(ApartmentState.STA);
pcat.Start();
pcat.Join();
CRemoteDataManagerClass、RemoteDataExportss和AWREM32.Document是程序集中的类

因此,我在第五行(
data=(RemoteDataExportss)mng.RetrieveObjectEx(“temp.chf”,(short)2,null);
)上得到一个异常,它说:

无法将类型为“winawsvr.CRemoteDataManagerClass”的COM对象强制转换为接口类型“winawsvr.IRemoteDataManager”。此操作失败,因为IID{82A1A806-8BA9-11CF-B95F-00A02412C812}接口的COM组件上的QueryInterface调用失败,原因是以下错误:Interfaz不兼容(HRESULT的异常:0x80004002(E\u NOINTERFACE))

我会错过什么?可能是COM组件注册方式的问题?在我尝试用regasm.exe注册它们之前,它们就已经存在了,只有CLSID中有LocalServer32键。在我运行regasm.exe之后,我相信这创建了两个:InprocHandler32和InprocServer32。前后我都有同样的例外

我在某个地方读到,我需要在设置为STA状态的线程中运行调用代码。所以我做了。还是没有变化

我注意到的另一件事是,当我对失败类所在的互操作程序集运行ildasm.exe时,我可以在IRemoteDataManager中看到以下行:
.custom instance void[mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string)=(01 00 24 38 32 41 41 38 30 36 2D 38 42 41 39/..$82A1A806-8BA9…
。具有TLB的IRemoteDataManager具有GUID
82A1A806-8BA9-11CF-B95F-00A02412C812
,该GUID与异常中提到的GUID相同。此GUID的前两部分位于我从ildasm提到的那一行(我想剩下的只是为了展示问题),所以那里的一切似乎都很好

我尝试过使用CRemoteDataManager(这是实现IRemoteDataManager的接口)而不是CRemoteDataManagerClass,但处理方式相同。在这两种情况下,例外总是提到CRemoteDataManagerClass。从我在ildasm CRemoteDataManagerClass中看到的情况来看,CRemoteDataManager和IRemoteDataManager都实现了。也许QueryInterface在其中一个方面失败了,或者完全是在其他方面

我不知道,很明显我到处都是

我还查看了互操作日志,以了解QueryInterface失败的确切原因,但我所找到的只是关于如何在.netcompactframework上实现这一点的文档。

我觉得

data = (RemoteDataExClass)mng.RetrieveObjectEx("temp.chf", (short)2, null);
可能有问题。(RemoteDataExports)我相信正在尝试在调用.RetrieveObjectEx之前将mng强制转换为其类型。这可能会导致错误。另一个选项可能是某个类对象不喜欢新运算符。我注意到,在各种情况下,这些库提供了新运算符,但也有其他类使用Create f函数。使用这些函数可能会得到进行检索所需的已创建类