我创建了一个接口,它继承自另一个(COM)接口:
public interface IDTSComponentMetaData : IDTSComponentMetaData90 { }
这就是它的全部功能。
原因在于,根据我使用的SQL Server版本不同,基础可能是IDTSComponentMetaData90(2005)或IDTSComponentMetaData100(2008)。为了避免在代码中有条件地编译对IDTSComponentMetaData90 / IDTSComponentMetaData100的每个引用,我想使用版本中立的接口来简单地包装适当的真实接口。
问题在于,SSIS在一个关键点向我传递了一个本地接口的对象,而我需要将其转换为我的包装接口:
#if SQL2005
public void Initialize(IDTSComponentMetaData90 c,IServiceProvider s) {
#elif SQL2008
public void Initialize(IDTSComopnentMetaData100 c,IServiceProvider s) {
#endif
m_ComponentMetaData = (IDTSComponentMetaData) c;
m_ServiceProvider = s;
}
这段代码可以编译通过,但在运行时我遇到了一个“无法将类型为'System.__ComObject'的COM对象转换为接口类型'MyNameSpace.IDTSComponentMetaData'”的错误。这是因为对IID为'{483E01E7-001C-35E4-Ac9f-4B0C1B81E409}'的接口进行COM组件的QueryInterface调用失败,导致出现“没有支持此类接口”的错误(HRESULT: 0x80004002 (E_NOINTERFACE))。
我的做法完全错误吗?