Как исправить ошибку «По крайней мере один из аргументов для« ... »нельзя маршалировать» при использовании MSDASC.DLL - PullRequest
2 голосов
/ 02 июля 2019

У меня есть настольное приложение C #, которое ссылается на COM-объект Microsoft OLE DB Service Component 1.0 Type Library. Это диалоговое окно, которое позволяет пользователю создавать и тестировать строку подключения. Код работал, как и ожидалось, в течение нескольких лет.

MSDASC Data Link Properties editor

Я обнаружил, что когда выполняется "Перестройка", появляется 18 не перечисленных предупреждений. Я считаю, что это означает, что предупреждения создаются при импорте библиотеки типов.

Все они являются формами:

Processing COM reference "MSDASC" from path "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll". The type library importer could not convert the signature for the member 'tagDBPROPIDSET.rgPropertyIDs'.
Processing COM reference "MSDASC" from path "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll". At least one of the arguments for 'DataLinks.RemoteCreateDBInstanceEx' cannot be marshaled by the runtime marshaler.  Such arguments will therefore be passed as a pointer and may require unsafe code to manipulate.

Разобравшись с этим, я обнаружил, что простое добавление ссылки на пустой проект WinForms вызовет предупреждения. Не требуется код для доступа к библиотеке MSDASC.

В качестве обходного пути я скопировал Interop.MSDASC.dll из дерева OBJ, сгенерированного во время перестройки, и скопировал его в папку проекта. Я удалил ссылку на MSDASC и добавил ее к Interop.MSDASC.dll в моем проекте.

Теперь, когда я перестраиваюсь, я не вижу предупреждений. Я удалил Interop.MSDASC.dll из дерева OBJ, и он воссоздан.

Это просто замаскировало мою проблему? Есть ли лучший способ использовать диалог и подавить или ответить на предупреждения?

Обновление: Это происходит в VS 2017 и 2019, но я верю, что это произошло и в предыдущих версиях.

Добавлено изображение окна списка ошибок:

enter image description here

1 Ответ

1 голос
/ 02 июля 2019

Они действительно tlbimp предупреждение. Вы можете проверить это, если вы запустите

TlbImp.exe "C:\Program Files (x86)\Common Files\System\Ole DB\oledb32.dll"

из командной строки разработчика VS (или по пути, подобному C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools, адаптируйтесь к вашей машине).

Вы должны увидеть точно такие же предупреждения.

Если вы не используете членов, перечисленных в предупреждении, вы в значительной степени в безопасности.

В противном случае вы можете удалить все ссылки на COM-ссылки, если вы отредактируете .csproj и добавите ключ ResolveComReferenceSilent к первому элементу PropertyGroup, например:

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <PropertyGroup>
    ...
    <ResolveComReferenceSilent>True</ResolveComReferenceSilent>
    ...
  </PropertyGroup>

Последнее решение - использовать tlbimp.exe вручную и ссылаться на его вывод. Вот пример: Подавление предупреждений tlbimp в visual studio

...