C # Как включить зависимости DLL в сборке? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть проект Visual C ++ (который строит на DLL с именем X), который ссылается на другую DLL (называется Y).

В моем визуальном проекте C ++ для X я установил ссылку на Y через настройки проекта, компоновщик, ввод и дополнительные зависимости.

Теперь у меня есть другой проект, проект C #, Z, который ссылается на X. Я включаю X в Z, добавляя X в качестве зависимости проекта.

По какой-то причине X необходимо скомпилировать, прежде чем я смогу скомпилировать Z (проект не будет собирать все одновременно).

Но затем, когда я запускаю Z и нажимаю ссылку на Z, я получаю исключение «Не удалось загрузить файл или сборку« X »или одну из ее зависимостей».

Когда я смотрю на папку сборки Z, я вижу там X.dll, но не Y.dll.

Как мне это исправить?

1 Ответ

0 голосов
/ 08 ноября 2018

Боюсь, вам нужно отредактировать файл проекта вручную, чтобы добиться такого поведения. (К сожалению, внутри визуальных проектов C ++ нет меню для этого.)

Я бы порекомендовал сделать резервную копию перед началом редактирования файла проекта.

В visual studio вам необходимо выгрузить файл проекта X (щелкните правой кнопкой мыши и выберите «выгрузить проект» в обозревателе решений).

Затем снова щелкните правой кнопкой мыши и выберите «Редактировать X.vcxproj».

Внутри элемента Project вам нужно добавить ItemGroup следующим образом:

<ItemGroup Condition="'$(Configuration)'=='Release'">
  <Content Include="E:\full_path\Y.dll">
    <Link>Y.dll</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)'=='Debug'">
  <Content Include="E:\full_path\Yd.dll">
    <Link>Yd.dll</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Если у вас нет другого файла DLL отладки (или 64- и 32-разрядной версии), вы можете использовать только одну группу элементов и удалить атрибут условия. Затем он скопирует Y.dll во все выходные данные проекта.

Затем сохраните изменения и перезагрузите проект (также щелкните правой кнопкой мыши).

Это решает проблему, потому что теперь проект 'Z' будет знать, что при сборке проекта 'X' ему нужно будет скопировать Y.dll в выходные данные проекта 'X' или родительский проект Ссылка 'X' .

(Было бы лучше использовать переменную вместо жестко закодированного пути, но я хотел сохранить пример простым.)

Я использую это во многих управляемых проектах C ++, которые ссылаются на сторонние или открытые библиотеки. И мне понадобилось время, чтобы понять это.

Надеюсь, это поможет!

...