2010-06-03 23 views
11

hello Chcę dodać niektóre pliki .h i .cpp w języku C#, aby uzyskać funkcjonalność C++ w języku C# Chcę używać tego kodu bezpośrednio bez tworzenia jakiegokolwiek pliku DLL.Czy mogę dodać pliki .h i .cpp do projektu C#?

Czy mogę to zrobić, jeśli tak, jak mogę to zrobić.

thanx z góry

+4

Dlaczego ktoś zgodziłby się na to pytanie? jest to uzasadnione pytanie dla kogoś, kto zaczyna rozwijać się z .NET i chce używać swoich bibliotek C++ –

Odpowiedz

6

Nie, nie możesz. Jeśli ilość kodu jest mała, możesz napisać klasę C# i wkleić w nią fragmenty kodu C++, tak aby zasadniczo przenieść tę klasę do C#. Oczywiście to nie zadziała, jeśli używasz funkcji językowej lub funkcji biblioteki, która nie jest w języku C#. Alternatywnie musisz skompilować swój kod C++ do czegoś wykonywalnego (albo natywna biblioteka DLL, idealnie płaskie funkcje w stylu C, albo zespół zarządzany), aby można było wywoływać to z kodu C#.

1

Nie. Nie możesz.

Będziesz musiał albo zmigrować kod do C#, albo dodać kod C++ do biblioteki DLL, a następnie wywołać ją z C#.

1

Jeśli już posiadasz kod w C++, najlepszą opcją jest użycie C++/CLI, gdzie możesz zawrzeć pliki .h i .cpp i odwołać się do skompilowanej biblioteki dll z twojego projektu C#.

4

Mimo że może być późno, chciałbym odpowiedzieć na twoje pytanie, ponieważ miałem podobny problem.

Możesz to zrobić poprzez skompilowanie kodu C++ do modułu sieciowego i dodanie modułu do linii poleceń CSharp.

Krótka historia. Pierwszy sposób jest następujący:

  1. tworzyć niestandardowe budować połączenia do pliku .cpp, jak cl/clr/MD/LN/link/DLL/LTCG/NOASSEMBLY włączoną opcją/NOENTRY yourfile.cpp
  2. dodawania produkowane netmodule do kompilacji cs

Ten szczegółowo opisano szczegółowo w pozycji here.

Drugi sposób jest:

  1. Tworzenie kolejny projekt C++/CLI z kodem
  2. Korzystanie ILMerge do scalenia C++/CLI złożenia projektu do C DLL # projektu

że jeden jest odkryte: here

To jest przykład konfiguracji MSBuild dla csproj na pierwszy sposób:

<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> 
Powiązane problemy