我有一個從C#中使用COM類的問題。 COM類是用C++ ATL 32位開發的。從C#中使用COM對象console-project
的COM級工作正常,當我使用它從VBA,VB6,C++,JavaScript和甚至從MSTest的/ C#
的奇怪的事情是,當我從一個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;
}
}
}
我沒有足夠的信譽分,回答我的問題。但她無論如何:
由於某種原因,COM對象不能從MTAThread創建。 MSTest默認爲STAThread,NUnit和Console默認爲MTAThread。將[STAThread]屬性應用於ConsoleTest.Main()和Test.CreateFlash()解決了這個問題。