Compile result for native C++ code mixed with managed code for .Net import -
i developing c++ wrapper c# project. little bit confused how end result compiled. have situation:
a solution 1 projects. project common language runtime support (/clr). native cpp files configured without common language runtime support (/clr) , no precompiled headers.
so questions are:
- why obligated have use no precompiled headers native cpp files?
- what end result, native code compiled machine code? or jit because use wrapper .net?
native header:
#pragma once #include <string> using namespace std; class person { private: string _name; public: person(string name); ~person(); string getname(); };
native cpp:
#include "stdafx.h" #include "person.h" person::person(string name) { _name = name; } person::~person() { } string person::getname() { return _name; }
c++ wrapper header
#pragma once #include <msclr\marshal_cppstd.h> #pragma unmanaged #include "person.h" using namespace system; using namespace msclr::interop; namespace wrapperlib{ public ref class personmanaged { private: person *_person; public: personmanaged(string ^name){ _person= new person(marshal_as<std::string>(name)); } ~personmanaged() { delete _person; _person = 0; } string ^getname(){ return gcnew string(_person->getname().c_str()); } }; }
edit:
thank answer luaan! helped! dowloaded ilspy , opened mixed assembly. found native person class in there.
using system; using system.runtime.compilerservices; using system.runtime.interopservices; [nativecppclass, unsafevaluetype] [structlayout(layoutkind.sequential, size = 24)] internal struct person { }
now like? there .net usings system system.runtime, there attribut nativecppclass?
you can have precompiled headers - problem managed precompiled headers not compatible native precompiled headers. msdn:
precompiled headers supported under /clr. however, if compile of cpp files /clr (compiling rest native) changes required because precompiled headers generated /clr not compatible generated without /clr. incompatibility due fact /clr generates , requires metadata. modules compiled /clr can therefore not use precompiled headers don't include metadata, , non /clr modules can't use precompiled header files contain meta data.
the article describes how around forcing 2 different precompiled headers, 1 or .net , 1 native. makes sense large projects, though.
as second question, depends. end result either native dll, or mixed managed/native assembly - in case, i'd bet on latter. i've used c++/cli .net wrappers of native types, though, might wrong. it's easy check, though - compile, , try using ilspy on resulting dll - if works, it's .net assembly, if doesn't, it's native dll.
if indeed case, yes, native code machine code, while managed parts il usual. see mixed assemblies further reference.
Comments
Post a Comment