Могу ли я добавить файлы .h и .cpp в проект С#?

Привет, я хочу добавить некоторые .h и .cpp файлы в С#, чтобы получить функциональность С++ в С#. Я хочу использовать этот код напрямую, не создавая никакого DLL файла.

Могу ли я сделать это, если да, как я могу это сделать.

thanx заранее

Ответ 1

Нет, вы не можете. Если количество кода невелико, вы можете написать класс С# и вставить в него фрагменты кода С++, чтобы вы по существу перенесли этот класс на С#. Очевидно, что это не сработает, если вы используете функцию языка или библиотечную функцию, которая не находится на С#. В качестве альтернативы вам нужно скомпилировать ваш код на С++ в исполняемый файл (либо встроенную DLL, в идеале плоские функции C-стиля, либо управляемую сборку), чтобы вы могли называть его кодом С#.

Ответ 2

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

Вы можете сделать это, скомпилировав код С++ в netmodule и добавив модуль в командную строку CSharp.

Короче говоря. Первый способ:

  • Создать собственный вызов сборки для .cpp файла, например cl/clr/MD/LN/link/DLL/LTCG/NOASSEMBLY/NOENTRY yourfile.cpp
  • Добавить созданный netmodule для компиляции cs

Ниже описывается здесь.

Второй способ:

  • Создайте еще один проект С++/CLI с кодом
  • Используйте ILMerge, чтобы объединить сборку проекта С++/CLI в вашу DLL проекта С#

Это раскрыто здесь

Это пример установки MSBuild для csproj для первого пути:

  <ItemGroup>
    <ClCompile Include="CppFile1.cpp" />
    <ClCompile Include="CppFile2.cpp" />
  </ItemGroup>
  <PropertyGroup>
    <NetmoduleName>CppCli.netmodule</NetmoduleName>
    <ClOptions>/nologo /clr /LN /I"$(SolutionDir)anotherDir" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "_DEBUG" /D "_WINDLL" /D "_MBCS" /Od /Gd /MDd </ClOptions>
    <LinkOptions>/LTCG /DLL /NOASSEMBLY /NOENTRY /DEBUG /MACHINE:X64 /SUBSYSTEM:WINDOWS /out:$(OutputPath)$(NetmoduleName) another.lib /LIBPATH:"$(SolutionDir)$(Configuration)" /LIBPATH:"anotherDir"</LinkOptions>
  </PropertyGroup>

  <Target Name="CustomCppBuildStep" Inputs="@(ClCompile)" Outputs="$(NetmoduleName)">
    <ItemGroup>
      <ClCompileFullName Include="@(ClCompile->'%(fullpath)', ' ')" />
    </ItemGroup>
    <Message Importance="high" Text="Compiling cpp: @(ClCompileFullName)" />
    <Exec Command="$(ComSpec) /c &quot;C:\Progra~2\Micros~3.0\VC\vcvarsall.bat amd64 &amp; cl $(ClOptions) @(ClCompileFullName) /link $(LinkOptions) &quot;" />
  </Target>
  <Target Name="BeforeBuild">
    <CallTarget Targets="CustomCppBuildStep" />
  </Target>

Ответ 3

Нет. Вы не можете.

Вам придется либо перенести код на С#, либо соединить код С++ в DLL, а затем вызвать его из С#.

Ответ 4

Если у вас уже есть код в С++, лучшим вариантом является использование С++/CLI, где вы можете включать файлы .h и .cpp и ссылаться на скомпилированную dll из вашего проекта С#.