Любой процессор, зависящий от C ++ / CLI, зависящий от нативного Cll (любой процессор для c ++ / cli) - PullRequest
17 голосов
/ 11 октября 2011

Вот моя проблема. Я оборачиваю C dll в C #. Для этого я сначала пишу оболочку C ++ / CLI. Собственная библиотека C связана с оболочкой C ++ / CLI. (Свойства компоновщика в проекте C ++ / cli).

Вот как все теперь организовано: - Родной C .lib: как x86, так и 64bit.

  • 1 решение, содержащее 2 проекта:
    • Проект оболочки C ++ / CLI, с которым связан нативный C .lib
    • C # проект, ссылающийся на проект C ++ / CLI

Моя проблема связана с тем, что мне нужен C # для цели "Любой процессор". Но эта опция недоступна в C ++ / CLI, поскольку она компилируется непосредственно в собственный код.

Моя идея решить эту проблему: - Скомпилируйте оболочку C ++ / CLI в x86, а затем измените конфигурацию и скомпилируйте 64-битную версию. Когда он скомпилируется, я хотел бы сказать ему, какую DLL взять на основе платформы. то есть: если компилируется в 64-битной версии, ссылка 64-битная собственная C dll, в противном случае, если x86, ссылка x86-собственная версия C. - После этого я смогу использовать любой процессор на моей платформе C #. Здесь, опять же, вместо того, чтобы ссылаться на мой проект оболочки C ++ / CLI, я бы ссылался на требуемый dll на основе целевой платформы.

Мои вопросы:

  • Как мне сказать проекту C ++ / CLI, на какую .lib ссылаться в зависимости от целевой платформы?
  • Как мне сказать C # проекту, на какой C ++ / CLI ссылаться на DLL на основе целевой платформы?

Позвольте мне добавить, что C # проект CLIB LIBRARY для использования клиентом x86 или x64.

Надеюсь, мой вопрос достаточно ясен. Любая помощь будет оценена!

ОБНОВЛЕНИЕ на основе: Условные ссылки в .NET проекте, возможно ли избавиться от предупреждения? ...

Итак, теперь я отредактировал мой файл .csproj, используя условие для ссылки на dll следующим образом:

<ItemGroup>
    <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=AMD64"
               Condition="$(Platform) == 'x64'">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\x64\Debug\AlibCppWrapper.dll</HintPath>
    </Reference>
    <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=x86"
               Condition="$(Platform) == 'x86'">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Debug\AlibCppWrapper.dll</HintPath>
    </Reference>
  </ItemGroup>

К сожалению, это не работает, поскольку $ (платформа) установлена ​​на AnyCPU ...

1 Ответ

21 голосов
/ 11 октября 2011

То, что вы описываете, известно как «параллельная сборка» (две версии одной и той же сборки, одна 32-битная и другая 64-битная) ... Я думаю, вы найдете их полезными:

РЕДАКТИРОВАТЬ - согласно комментарию:

Здесь вы можете найти пошаговое руководство для точно вашего сценария (DLL-библиотека .NET, C ++ / CLI DLL, ссылающаяся на собственную DLL) http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/

...