我试图使用第三方COM DLL(我不相信它的.NET组件)从.NET服务,而无需注册的COM DLL,但我有到目前为止没有运气。
我已经从这里复制的清单文件(http://stackoverflow.com/questions/465882/generate-manifest-files-for-registration-free-com)作为起点使用(I产生的COM DLL清单使用引用的mt.exe / regsvr42.exe)。但是我得到的是以下错误:
异常:System.InvalidCastException 消息:无法将“LOGICLib.LogicClass”类型的COM对象强制转换为接口类型“LOGICLib.ILogic”。此操作失败的原因是对IID“{AAAAAAAA-AAAAAAAA-AAAA-AAAAAA3E8FB4}”的界面处的COM组件调用QueryInterface失败,因为以下错误:不支持此接口(从HRESULT异常:0x80004002(E_NOINTERFACE)) 。 资料来源:Interop.LOGICLib 在LOGICLib.LogicSecuredClass.Connect(字符串IP,UInt16值,Int32和结果) 在My.Server.MyAssembly.Loader.Connect()中d:\ MyProject的\源\服务器\ MyAssembly程序\ Loader.cs:行461
应用程序清单以启动服务的exe命名 - 我也尝试在调用COM DLL的程序集之后命名它。我试过在命令行和Visual Studio的调试器上启动。我也尝试过使用第三方提供的Interop文件并生成自己的文件。
(注意 - 到目前为止,我只在Windows XP下测试过。)
我现在花了两天时间在这上面并没有取得任何进展。我可能错过了什么想法?
答案 0 :(得分:4)
应用程序清单以启动服务的exe命名
是的,这不起作用。 Windows始终在EXE本身中查找清单,作为非托管资源嵌入。只有当它找不到那个时才会在磁盘上查找.manifest文件。问题是,使用VS2008构建的托管程序已经有了清单。默认情况下,“我只能识别Vista”。
您可以使用File + Open + File并选择您的EXE来自行验证。打开RT_MANIFEST节点,然后双击资源1.如果您没有看到那些没有注册的COM清单条目,那么它将不起作用。
要修复,请使用Project + Add New Item并选择Application Manifest File项目模板。您将获得样板清单,将您的regfree COM条目复制并粘贴到那里。
答案 1 :(得分:-1)
嗯,从异常开始,当您尝试将LogicClass类型的对象强制转换为ILogic的接口类型时,您会收到强制转换错误。看起来LogicClass没有实现ILogic。
你没有提供DLL或你得到它的地方,所以你最好的办法是查看你想要使用的库的文档。只是一个疯狂的猜测,但看起来你正在错误地实现它。