none
C#编写的COM组件,C++调用,在其他机器上运行时,无法执行(非组件注册原因) RRS feed

  • 问题

  • 之前碰到问题,是side by side的问题,多谢版主的提醒,解决了那个问题。
    链接:http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/e24d065f-7841-4f26-bcb2-c0d509dfb754

    环境,vs2005,C#,.net2.0
    测试机环境:.net 2.0,无vs2005。

    我在我自己的电脑上,把C#类库项目的项目属性设定为COM可见,编译时为COM interop互操作注册。签名里也加入了snk密钥文件。
    我有写过简单的COM测试程序,放到测试机上,注册com组件后,VC的执行程序是可以正常执行的。应该可以排除是COM组件注册的原因和一些最基本的com组件生成步骤错误的原因。

    我写的用VC调用COM组件程序,在我自己的机器上是可以正常执行的。
    拿到测试的机器上注册COM组件后,再执行,提示错误"this application has requested the runtime to terminate it in an unusual way."这个错误,应该是因为COM组件里的程序代码写的有错误。但是我很无法知道具体错在哪。
    我写COM组件里的程序也很简单,功能也就是用来按格式写入文件,只用到了MemoryStream内存流,IO的文件写入,用filestream写的,还有Encoding类用来编码字符的,其他的就没了。

    请问有经验的朋友们,是否是因为某些程序内容需要特殊设定才能在C++中正常调用?
    2010年3月16日 8:12

答案

  • 很感谢Michael Lee2和mazhou的关注。
    最后的问题解决了。

    错误内容是在于这两句语句上
    IPHostEntry host = Dns.GetHostEntry(server);
    然后我用TCPclient.connect链接host得到的ipaddresslist[0]。
    这个地方出错了,在我自己的机器上可以正常运行,在测试机上却不能正常运行。
    我把IPHostEntry host = Dns.GetHostEntry(server);这一句改动下,用IPAddress.Parse()方式获得目标的IP地址再链接就没问题了。

    我还是不清楚那一句为何会测试通不过。

    to:mazhou:没改这句语句之前,尝试过设定securityPermission,依然会出错。但是securityPermission确实很有用,修改语句后,步设定securityPermission依然会出错。
    2010年3月17日 2:16

全部回复

  • 这个……

    主要是问题位置不好确定。建议你这样做:
    在 COM 程序和COM 客户端程序中,加入写日志的代码,进行调试。尤其是,COM 客户端程序中的创建COM对象,查询接口、调用接口方法等地方。

    从提示上看,我怀疑用Visual C++ 写的COM 客户端程序有问题的可能性大一些。
    2010年3月16日 8:54
  • IO操作上,我一步一步的测试下来,最后没有错误了...可是跟最开始的程序还是一模一样,一个字母没改动。 现在错误出现到了网络传输上了
    2010年3月16日 9:15
  • IO读写文件那一块没有错误,虽然我还是不知道为什么最开始会有错误,到后来一个代码没改却没有错误了。

    现在我分步测试了一下,客户端程序中调用COM的一个方法,方法里有这两行,从这两行就开始出错了(我把这两行后边的内容先注释掉了),执行不过去
    {
     TcpClient client = new TcpClient();
     IPHostEntry host = Dns.GetHostEntry(server);
    }
    2010年3月16日 9:24
  • 看来错误信息也不确定啊。。。您的 COM 程序集只标记了 ComVisible?有没有 Guid,CoClass 或者 ClassInterface?还有有没有 SecurityPermission?
    Mark Zhou
    2010年3月16日 9:25
  • 呃,Guid还是有的。
    但是COM中的类前边,我只加了Guid这个属性,别的属性像 ClassInterface(ClassInterfaceType.AutoDispatch)这种属性,我就没有加进去了,会因为这个?
    2010年3月16日 9:28
  • ClassInterface 还是很重要的,它告诉 COM 服务器怎么调度 COM 对象。试试看吧,我也不能确定是不是这个问题。
    Mark Zhou
    2010年3月16日 9:30
  • 我把ClassInterface(ClassInterfaceType.XX)里的Nnoe,AutoDispattch,AutoDual这3个枚举都试过一次,那两行程序那里还是出错。
    2010年3月16日 9:36
  • 你用 GetLastError 看看是什么错吧。SecurityPermission 有设置吗?
    Mark Zhou
    2010年3月16日 9:46
  • 很感谢Michael Lee2和mazhou的关注。
    最后的问题解决了。

    错误内容是在于这两句语句上
    IPHostEntry host = Dns.GetHostEntry(server);
    然后我用TCPclient.connect链接host得到的ipaddresslist[0]。
    这个地方出错了,在我自己的机器上可以正常运行,在测试机上却不能正常运行。
    我把IPHostEntry host = Dns.GetHostEntry(server);这一句改动下,用IPAddress.Parse()方式获得目标的IP地址再链接就没问题了。

    我还是不清楚那一句为何会测试通不过。

    to:mazhou:没改这句语句之前,尝试过设定securityPermission,依然会出错。但是securityPermission确实很有用,修改语句后,步设定securityPermission依然会出错。
    2010年3月17日 2:16