使用C#控制台项目中的COM对象

使用C#控制台项目中的COM对象,com,com-interop,Com,Com Interop,我在使用C#中的COM类时遇到问题。COM类是用C++ ATL 32位开发的。 使用VBA、VB6、C++、JavaScript,甚至MSTest/C<< /P>时,COM类工作正常。 wierd的一点是,当我从NUnit测试或控制台应用程序创建实例时,它会失败,出现以下异常: System.InvalidCastException : Unable to cast COM object of type 'PvtsFlashLib.FlashClass' to interface type 'P

我在使用C#中的COM类时遇到问题。COM类是用C++ ATL 32位开发的。 使用VBA、VB6、C++、JavaScript,甚至MSTest/C<< /P>时,COM类工作正常。 wierd的一点是,当我从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
Copy Local = True
Embed Interop Types = False
Isolated = False
两个项目中的COM引用都设置为:

Platform = x86
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。将[StatThread]属性应用于ConsoleTest.Main()和Test.CreateFlash()可以解决此问题。

根据您的判断,此问题与运行在与.NET代码不同单元中的COM对象有关。根据这一观察,QueryInterface失败的最可能原因是目标接口无法跨单元封送。这在COM中可能是一个问题,即使不涉及.NET

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

但是,如果您的接口可以使用代理/存根封送处理程序,那么您也可以将其用于MTA线程。由于您提到您正在使用ATL,您只需在中设置“允许合并代理/存根代码”选项

上的MSDN主题也可能为您提供一个很好的参考