Как получить конвейерный компонент для IDTSComponentMetadata100

#ssis

#ssis

Вопрос:

Я пишу редактор пользовательского интерфейса для пользовательского компонента конвейера SSIS.

Когда BIDS вызывает редактор, он передает экземпляр IDTSComponentMetadata100 редактору. Как мне получить ссылку на мой (управляемый) Производный экземпляр конвейерного компонента?

Комментарии:

1. ManagedComponentHost. InnerObject вернет конвейерный компонент … кто-нибудь знает, как получить доступ к ManageComponentHost или чему-либо, что возвращает IDTSManagedComponent100?

Ответ №1:

Я полагаю, что вы хотите сделать что-то вроде этого:

 void Initialize(
    IDTSComponentMetaData100 dtsComponentMetadata,
    IServiceProvider serviceProvider
){
    IDtsPipelineEnvironmentService pipelineService = (IDtsPipelineEnvironmentService)serviceProvider.GetService(typeof(IDtsPipelineEnvironmentService));
    IDTSPipeline100 mainPipe = pipelineService.Pipeline;
    // access mainPipe.PathCollection etc
    TaskHost pipelineTaskHost = pipelineService.PipelineTaskHost;
    MainPipe mainPipe2 = pipelineTaskHost.InnerObject as MainPipe;
    // that is less direct but should work too
}
  

Вы можете делать другие интересные вещи с ServiceProvider, например, проверять соединения или переменные пакета, передавая другой тип в GetService. Подробности см. в SQL2008R2 BOL.

Ответ №2:

Попробовал маршрут через службу конвейера, но моих пользовательских компонентов потока данных (разработанных на C #) не было в IDTSPipeline100.PathCollection — были стандартные компоненты Microsoft.

Копнув немного глубже, я попытался получить mainPipe.GetObjectByID(componentID), который работает, но возвращает COM-объект, а не C # / управляемый объект. Попытка приведения выдает исключение «вы не можете выполнить приведение из COM в C #Managed».

Я не могу подтвердить, но сильно подозреваю, что мои C # / Управляемые пользовательские компоненты не отображаются в PathCollection, поскольку они являются C # / управляемым компонентом по сравнению с COM.