gpt4 book ai didi

com - 从 C# 控制台项目中使用 COM 对象

转载 作者:行者123 更新时间:2023-12-04 16:06:37 25 4
gpt4 key购买 nike

我在使用 C# 中的 COM 类时遇到问题。 COM 类是用 C++ ATL 32 位开发的。

当我在 VBA、VB6、C++、Javascript 甚至 MSTest/C# 中使用 COM 类时,它工作得很好

奇怪的是,当我从 NUnit 测试或控制台应用程序创建实例时,它会失败并出现以下异常:

System.InvalidCastException : Unable to cast COM object of type 'PvtsFlashLib.FlashClass' to interface type 'PvtsFlashLib.IFlash4'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{07065455-85CD-42C5-94FE-DDDC1B1A110F}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

有人可以指出我正确的方向吗?

在此先感谢您的帮助。

测试项目和控制台项目的构建配置设置为:
Platform = x86

两个项目中的 COM 引用设置为:
Copy Local = True
Embed Interop Types = False
Isolated = False

运行良好的 MSTest 代码:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PvtsFlashLib;

namespace TestProject1
{
[TestClass]
public class TestOfComMSTest
{
[TestMethod]
public void CreateFlash()
{
var flash = new Flash();
flash.AdvancedOptions = PvtsFlashAdvancedOptionsEnum.AllProperties;
}
}
}

NUnit 测试失败的代码:
using NUnit.Framework;
using PvtsFlashLib;

namespace Test
{
[TestFixture]
public class TestOfComNUnit
{
[Test]
public void CreateFlash()
{
var flash = new Flash();
flash.AdvancedOptions = PvtsFlashAdvancedOptionsEnum.AllProperties;
}
}
}

控制台应用程序也失败的代码:
using PvtsFlashLib;

namespace ConsoleTest
{
class Program
{
static void Main(string[] args)
{
var flash = new Flash();
flash.AdvancedOptions = PvtsFlashAdvancedOptionsEnum.AllProperties;
}
}
}

我没有足够的声望点来回答我自己的问题。但她还是这样:

由于某种原因,不能从 MTAThread 创建 COM 对象。 MSTest 默认为 STAThread 和 NUnit,Console 默认为 MTAThread。将 [STAThread] 属性应用于 ConsoleTest.Main() 和 Test.CreateFlash() 可以解决问题。

最佳答案

正如您所确定的,问题与在与您的 .NET 代码不同的单元中运行的 COM 对象有关。鉴于这一观察,QueryInterface 失败的最可能原因是目标接口(interface)不可跨单元编码。即使不涉及 .NET,这在 COM 中也可能是一个问题。

您确实找到了最简单的解决方案,即确保您的 .NET 代码在 STA 线程中运行以匹配您的 COM 组件。

但是,如果您的接口(interface)可以使用代理/ stub 编码(marshal)拆收器,您也可以让它与 MTA 线程一起使用。既然您提到您正在使用 ATL,您可以简单地在 Application Settings 中设置“允许合并代理/ stub 代码”选项。 .

Interface Marshaling 上的 MSDN 主题也可以为您提供很好的引用。

关于com - 从 C# 控制台项目中使用 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8827777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com