我有一個通用的基礎包裝類來封裝夫婦COM組件,我們使用:互操作類作爲泛型類型參數時出現什麼問題?
public class WrapperBase<T> : IDisposable
where T : new()
{
private T comObject = default(T);
private ComponentParameters parameters = null;
protected WrapperBase()
{
comObject = new T();
Initialize();
}
public void SetParameters(ComponentParameters parameters)
{
// ...
this.parameters = parameters;
}
// ...
}
現在我有一個具體的包裝類從這個基類繼承:
public class UserWrapper : WrapperBase<CUserClass>
{
public UserWrapper() : base() { }
public void SomeUserWrapperMethod()
{
// ...
}
}
的使用的類型(CUserClass)是COM互操作類型。添加COM對象作爲項目的引用後,此類型可用。
現在,我使用這個類在其他組件(它引用了上述類型定義的組件):
using (var user = new UserWrapper())
{
user.SomeUserWrapperMethod();
}
上面的代碼編譯罰款,但如果我實際調用SetParameters方法(這是隻有在Wrapperbase類中定義):
using (var user = new UserWrapper())
{
user.SetParameters(someParameters);
}
我得到了(雙)編譯錯誤:
- error CS0012: The type 'ComponentsAssembly.CUserClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'Interop.ComponentsAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...'.
- ComponentWrappers.dll: (Related file) error CS0310: 'ComponentsAssembly.CUserClass' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'Contact.Wrappers.WrapperBase'
我試着添加對組件的引用,但仍然收到相同的錯誤消息。
在我將WrapperBase更改爲泛型類型之前,它曾用於工作,但後來在所有具體包裝中存在大量相同的代碼,所以我重構了它,使WrapperBase在過程中成爲泛型。
public class UserWrapper : WrapperBase<CUserClass>
{
public UserWrapper() : base() { }
public UserWrapper(ComponentParameters parameters) : base()
{
SetParameters(parameters)
}
}
,然後使用它像這樣:
using (var user = new UserWrapper(someParameters))
{
user.SomeUserWrapperMethod();
}
我其實可以通過增加一個構造函數的具體類,這需要「ComponentParameters」作爲參數,並調用內部的SetParameters解決這個問題
但我寧願有兩個方法工作(使用構造函數和明確調用SetParameters)。
有人可以向我解釋這裏發生了什麼,因爲在過去的幾個小時裏,我一直在撞牆。
因此,讓我直截了當地說,WrapperBase <>是在ComponentWrappers.dll程序集中定義的,但實際上是在某種類型的主程序正確嗎?您在主程序本身中添加了對interop的引用,而不是COmponentWrapper.dll? – 2011-03-25 16:15:04
@詹姆斯:不完全。 WrapperBase <>和UserWrapper都在ComponentWrappers.dll中,COM互操作DLL只在ComponentWrappers.dll中引用。在主程序中,我只使用UserWrapper類(並引用了ComponentWrappers.dll)。但即使我在主程序中添加了對interop dll的引用,仍然會得到相同的編譯錯誤。 – fretje 2011-03-25 16:17:21
您是否嘗試過將互操作程序集的引用添加到主程序中? – 2011-03-25 16:19:54