Подтвердить что ты не робот

Любой процессор, зависящий от С++/CLI, зависит от родной C dll (любой процессор для С++/cli)

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

Вот как это все организовано сейчас: - Нативный C.lib: оба x86 и 64bit.

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

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

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

Мои вопросы:

  • Как сообщить проекту С++/CLI, который .lib для ссылки на целевую платформу?
  • Как я могу сказать, что проект С#, с которым dll С++/CLI ссылается на целевую платформу?

Добавлю, что С# проект CLIB LIBRARY, который будет использоваться клиентом x86 или x64.

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

UPDATE на основе: Условные ссылки в .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>

К сожалению, это не работает, поскольку для $(Platform) установлено значение AnyCPU...

4b9b3361

Ответ 1

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

EDIT - в соответствии с комментарием:

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