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