我创建了我从另一个(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)) 。
我在做什么完全错误?
因为我真的是一个C++程序员,从来不知道可以用那种方式使用。我现在要试一下,如果它有效,你会为我节省很多痛苦! – 2010-08-05 21:10:30
这将很好地工作,除了你不能集中指定,你必须在每个你想使用你的接口别名的文件的顶部指定它。 – 2010-08-05 21:22:50
这看起来像在工作!太糟糕了C#没有#include指令,因为Lasse对重复是正确的,并且有大约14个.cs文件需要20个左右的替换。 但是,这仍然比替代方案的负载更好,这是为了保持2套源代码,2005年的另一个2008版本。 我想CRTL + C将成为我未来几个小时的新朋友。 – 2010-08-06 13:36:29