我有一個助手類爲共享內存中一個COM對象的引用我的單元測試:COM對象被釋放非故意
public class UnitTestGeometryProvider
{
public static readonly IGeometry Geometry = Deserialize();
}
幾何是從一個存儲XML文件反序列化作爲資源文件並附加到項目中。此後,它被包裹成一個COM對象:
public static IGeometry Deserialize()
{
return (IGeometry) new XMLSerializerClass().LoadFromString(myXDoc.OuterXml, null, null);
}
現在我有一個使用存儲在這個類的幾何兩種測試的方法:
[TestClass()]
public class MyTest
{
[TestMethod()]
public void FirstTest()
{
var p = UnitTestGeometryProvider.Geometry;
}
[TestMethod()]
public void SecondTest()
{
var p = UnitTestGeometryProvider.Geometry;
}
}
當運行第二個,我收到了收到COMException:
不能使用 已從與其基礎RCW分開COM對象
我想知道爲什麼COM對象的引用被釋放,因爲它在UnitTestGeometryProvider
中標記爲static
,我沒有明確釋放它。因此,即使如果的管理資源的實例將走出去的範圍(這是不它是靜態的),下面的COM對象應消失,只有當所有我的測試結束時,或者當應用程序終止比較一般,或者我錯過了什麼?
我正在使用ArcObjects和Visual NUnit。
使用COM對象初始化* static *字段是一個非常糟糕的主意,只能偶然使用。您無法保證這發生在正確的時間和正確的線程上。重要的是*一個*,公寓線程的COM對象由一個特定的線程擁有,如果該線程結束,那麼該對象就像門帽一樣死了。如果對象仍然爲空,請使用屬性來調用Deserialize()。 –
@HansPassant好吧,但不是上面的單線程測試給出的測試嗎?這裏沒有涉及多線程,還是'static'暗示它自己? – HimBromBeere
這樣的變量從類型初始值設定項(又名靜態構造函數)中獲取它的值。 .NET對於何時或如何運行提供了很少的保證,只是它們足夠早地運行。你有一個測試運行者,可能有自己的想法,它在運行測試之前如何初始化所有的東西。如果你想要保證這永遠不會出錯,那麼你不能得到一個,你有非常有力的證據證明它*出錯了。 –