3

在 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 上运行正常。神秘事物。

4

0 回答 0