在C#中调用VB6.0 COM组件时的奇怪行为(在python中都可以)

时间:2013-06-02 12:02:58

标签: .net com vb6

在C#中使用COM组件时遇到一些问题。

我有旧的(〜2001 - 2003年开发)VB6 COM组件,遗憾的是它没有源代码。组件与服务程序交互(也没有来源)。主应用程序是用VB6编写的,现在我在.Net上重写它。

我已将(使用TblImp)组件导入C#并调用它:

using System;
using System.Threading;
using System.Collections.Generic;
using System.Text; 
using System.Runtime.CompilerServices;

using SrvCommDCG;

class Program
{ 
    [STAThread]
    static void Main(string[] args)
    {
        if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
        {
        System.Console.WriteLine("calling com");
        clsCommDCGService srv = new clsCommDCGService();
        srv.Check();
        System.Console.ReadKey();
        }
    }
}

当我在Windows 7上运行时,没有任何反应(检查完成后组件应显示消息框)。
当我在Windows 8上运行它时,程序崩溃没有任何异常。

我尝试过不同的线程模型:MTA,STA(使用[STAThread]SetApartmentState()),调用DisableComObjectEagerCleanup() - 没有任何帮助。

在没有结果的一周之后,我试图在Python中使用我的组件,并且:

import win32com.client
tst = win32com.client.Dispatch("SrvCommDCG.clsCommDCGService")
tst.Check()

一切正常,检查没问题,MessageBox出现了。

Ofc,它也适用于VB 6.0。

我认为,问题是python是单线程win32应用程序,而C#是多线程托管代码。而且我缺少一些观点来理解我应该添加到C#代码中,以使其工作?不幸的是,我需要从.Net上调用它。

编辑#1:我尝试过.Net 4.0和4.5,以及.Net 2.0框架

编辑#2:当程序在Windows 8上崩溃时,没有任何有用的消息(即使我从VS C#调试器运行程序),它只是写“程序出现问题并将被关闭”(有俄语Win8,无法告诉你Windows中的确切消息)。 Win8中的事件日志说:由于地址012E72CC处的未处理异常c0000005,进程被终止。这是一个简单的访问冲突。

编辑#3:虽然C#程序在Win7 / 8上运行不正常,但它在Windows XP上运行正常。 Mysterios事。

0 个答案:

没有答案