Обратная совместимость со ссылками на COM в .NET

#c# #com

#c# #com

Вопрос:

В качестве простого примера я хочу использовать CertEnroll для получения сертификата в .NET. Единственная строка кода, которая показывает сбой:

 CX509CertificateRequestPkcs10 certRequest = new CX509CertificateRequestPkcs10();
  

Мой блок разработки — Windows 10, и когда я компилирую и запускаю там код, он работает нормально. Однако при компиляции на Win10 и копировании двоичных файлов в «более старую» ОС (например, Windows Server 2008 R2) выдается исключение InvalidCastException, в котором говорится, что такой интерфейс не поддерживается.

Насколько я понимаю, это связано с тем, что com-файл CertEnroll в Windows 10 является более новым. Глядя на взаимодействие для CX509CertificateRequestPkcs10, он реализует IX509CertificateRequestPkcs10V5, но на сервере это только IX509CertificateRequestPkcs10V5. Таким образом, при компиляции в Windows 10 сгенерированное взаимодействие ожидает, что объект среды выполнения реализует интерфейс, о котором реализация COM на сервере Windows не знает.

Из моих исследований я обнаружил следующие возможные решения, хотя я не уверен, какой из них является «правильным» способом сделать это.

1) Продолжайте использовать COMReference и используйте только самую низкую операционную систему, которую мы поддерживаем (неприемлемо для целей разработчика)

2) Возьмите CertEnroll dll из самой низкой операционной системы и ссылайтесь на нее, используя COMFileReference . (Это кажется неправильным, потому что тогда мы жестко кодируем этот двоичный файл вместо использования более современного CertEnroll в новых операционных системах)

3) Возьмите CertEnroll из самой низкой операционной системы, используйте его для создания файла tlb и ссылки на него с помощью COMFileReference . Я думал, что это сработает, поскольку tlb будет более «ограничительным» из-за того, что он поступает из самой низкой операционной системы, но, похоже, когда Visual Studio генерирует фактический двоичный файл взаимодействия, он по-прежнему использует мои интерфейсы Windows 10 CertEnroll, что делает его несовместимым с более низкими операционными системами.

4) Возьмите CertEnroll из самой низкой операционной системы, используйте его для создания файла tlb, а также файла взаимодействия, оба вручную. Ссылайтесь на взаимодействие как на ссылку COMFileReference . Здесь я не уверен, как это будет работать, нужно ли мне также запускать tlbimp на сервере 2008, чтобы убедиться, что взаимодействие генерируется с использованием более старой версии ссылки COM?

Если я чего-то не понимаю, и есть другой вариант, пожалуйста, дайте мне знать.

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

1. Когда я декомпилирую библиотеку типов с OleView.exe на моем компьютере (Win10 1607) он сообщает мне, что интерфейсом по умолчанию является IX509CertificateRequestPkcs10V4. Как вы получили V5, трудно догадаться. Типичная ошибка agile, кстати, большая проблема с Win10. Приведение к IX509CertificateRequestPkcs10V3 для обеспечения обратной совместимости.