{"id":3633,"date":"2019-12-18T17:55:36","date_gmt":"2019-12-18T15:55:36","guid":{"rendered":"https:\/\/mariusbancila.ro\/blog\/?p=3633"},"modified":"2020-06-03T08:55:00","modified_gmt":"2020-06-03T06:55:00","slug":"cpp-cli-projects-targeting-net-core-3-x","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/","title":{"rendered":"C++\/CLI projects targeting .NET Core 3.x"},"content":{"rendered":"<p>The .NET Core framework version 3.1 was released earlier this month, alongside with Visual Studio 2019 16.4 (which you must install in order to use .NET Core 3.1). Among the changes, it includes support for C++\/CLI components that can be used with .NET Core 3.x, in Visual Studio 2019 16.4. However, not everything works out of the box. In this article, I will show how you can create and consume C++\/CLI components targeting .NET Core 3.1.<\/p>\n<p><!-- more --><\/p>\n<h3>Prerequisites<\/h3>\n<p>You need to have to following:<\/p>\n<ul>\n<li><strong>Visual Studio 2019 16.4<\/strong> (or a newer update; as of now, the latest update is 16.4.2)<\/li>\n<li><strong>Desktop development with C++<\/strong> workload<\/li>\n<li><strong>C++\/CLI support<\/strong> individual component<br \/><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vsinstallercppcli.png\" alt=\"\" width=\"685\" height=\"350\" class=\"alignnone size-full wp-image-3645\" srcset=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vsinstallercppcli.png 685w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vsinstallercppcli-300x153.png 300w\" sizes=\"auto, (max-width: 685px) 100vw, 685px\" \/><\/li>\n<\/ul>\n<p>When you install this component you get two new project templates:<\/p>\n<ul>\n<li>CLR Class Library (.NET Core)<\/li>\n<li>CLR Empty Project (.NET Core)<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vscppcli.png\" alt=\"\" width=\"944\" height=\"319\" class=\"alignnone size-full wp-image-3647\" srcset=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vscppcli.png 944w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vscppcli-300x101.png 300w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vscppcli-768x260.png 768w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vscppcli-700x237.png 700w\" sizes=\"auto, (max-width: 944px) 100vw, 944px\" \/><\/p>\n<h3>Creating a C++\/CLI component<\/h3>\n<p>To demonstrate how the whole thing works, let us create a CLR Class Library (.NET Core) project (that we will called <em>CoreClassLib<\/em>). In this class library, we will create a C++\/CLI class called <tt>Display<\/tt> that contains a single method <tt>Print()<\/tt> that simply prints a message to the console.<\/p>\n<pre class=\"lang:c++ decode:true \" >#pragma once\r\n\r\nnamespace CoreClassLib \r\n{\r\n\tref class Display\r\n\t{\r\n\tpublic:\r\n\t\tvoid Print(System::String^ message);\r\n\t};\r\n}<\/pre>\n<pre class=\"lang:c++ decode:true \" >#include \"Display.h\"\r\n\r\nnamespace CoreClassLib\r\n{\r\n   void Display::Print(System::String^ message)\r\n   {\r\n      System::Console::WriteLine(message);\r\n   }\r\n}<\/pre>\n<p>Then, we will create a C++ class, called <tt>Widget<\/tt> that has a single method called <tt>WriteText()<\/tt> that is supposed to print the message (to the console). To do so, it uses an instance of the <tt>Display<\/tt> class. The <tt>Widget<\/tt> is exported from the project, so it can be consumed from other modules. In order to be able to compile it, the mixed-managed components must not be part of the declaration of the <tt>Widget<\/tt> class. For this purpose, we use the PIMPL idiom below.<\/p>\n<pre class=\"lang:c++ decode:true \" >#pragma once\r\n#include &lt;string&gt;\r\n\r\n#ifdef DLL_EXPORT\r\n#define DLL_API __declspec(dllexport)\r\n#else\r\n#define DLL_API __declspec(dllimport)\r\n#endif\r\n\r\nclass WidgetImpl;\r\n\r\nclass DLL_API Widget\r\n{\r\n   WidgetImpl* impl;   \r\n\r\npublic:\r\n   Widget();\r\n   ~Widget();\r\n\r\n   void WriteText(std::string const&amp; message);\r\n};<\/pre>\n<pre class=\"lang:c++ decode:true \" >#include \"Widget.h\"\r\n#include \"Display.h\"\r\n#include &lt;vcclr.h&gt;\r\n\r\nclass WidgetImpl\r\n{\r\n   gcroot&lt;CoreClassLib::Display^&gt; display;\r\npublic:\r\n   WidgetImpl()\r\n      :display(gcnew CoreClassLib::Display())\r\n   {\r\n   }\r\n\r\n   void WriteText(std::string const&amp; message)\r\n   {\r\n      display-&gt;Print(gcnew System::String(message.c_str()));\r\n   }\r\n};\r\n\r\nWidget::Widget()\r\n   :impl(new WidgetImpl())\r\n{\r\n}\r\n\r\nWidget::~Widget()\r\n{\r\n   delete impl;\r\n}\r\n\r\nvoid Widget::WriteText(std::string const&amp; message)\r\n{\r\n   impl-&gt;WriteText(message);\r\n}<\/pre>\n<p>To compile this as a mixed-mode module targeting .NET Core 3.1 you need the following settings in the project properties:<\/p>\n<ul>\n<li><strong>.NET Core Runtime Support (\/clr:netcore)<\/strong> for <em>Common Language Runtime Support<\/em><\/li>\n<li><strong>netcoreapp3.1<\/strong> for <em>.NET Core Target Framework<\/em><\/li>\n<\/ul>\n<p>You can see these settings in the image below:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore1.png\" alt=\"\" width=\"786\" height=\"544\" class=\"alignnone size-full wp-image-3634\" srcset=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore1.png 786w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore1-300x208.png 300w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore1-768x532.png 768w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore1-700x484.png 700w\" sizes=\"auto, (max-width: 786px) 100vw, 786px\" \/><\/p>\n<h3>Consuming the mixed-mode component from a native application<\/h3>\n<p>To consume the exported <tt>Widget<\/tt> class that is using the C++\/CLI <tt>Display<\/tt> class, we can create a C++ Console application with the following code (of course, you need to properly setup the additional include directories and additional library directories so it can locate the headers and .lib file).<\/p>\n<pre class=\"lang:c++ decode:true \" >#include \"Widget.h\"\r\n\r\nint main()\r\n{\r\n    Widget widget;\r\n    widget.WriteText(\"Hello, world!\");\r\n}<\/pre>\n<p>Although this compiles without errors, when you run it, you get the following exception:<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore2.png\" alt=\"\" width=\"401\" height=\"248\" class=\"alignnone size-full wp-image-3635\" srcset=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore2.png 401w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore2-300x186.png 300w\" sizes=\"auto, (max-width: 401px) 100vw, 401px\" \/><\/p>\n<p>The reason for this is that .NET Core requires a file called <em>&lt;appname&gt;.runtimeconfig.json<\/em> to accompany every .NET Core module. This file is used to define required shared frameworks and runtime options. You can read more about this file here:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/core\/run-time-config\/\" target=\"_blank\" rel=\"noopener noreferrer\">.NET Core run-time configuration settings<\/a><\/li>\n<li><a href=\"https:\/\/natemcmaster.com\/blog\/2019\/01\/09\/netcore-primitives-3\/\" target=\"_blank\" rel=\"noopener noreferrer\">Deep-dive into .NET Core primitives, part 3: runtimeconfig.json in depth<\/a><\/li>\n<\/ul>\n<p>The problem is that this file, which should be called <em>CoreClassLib.runtimeconfig.json<\/em> for our example, is not generated by Visual Studio when creating the CLR Class Library project. This is a know bug, as reported here: <a href=\"https:\/\/github.com\/dotnet\/sdk\/issues\/3889\" target=\"_blank\" rel=\"noopener noreferrer\">C++\/CLI projects do not generate .runtimeconfig.json<\/a>.<\/p>\n<p>We can fix this by creating the CoreClassLib.runtimeconfig.json file with the following content.<\/p>\n<pre class=\"lang:default decode:true \" >{\r\n  \"runtimeOptions\": {\r\n    \"framework\": {\r\n      \"name\": \"Microsoft.NETCore.App\",\r\n      \"version\": \"3.1.0\"\r\n    }\r\n  }\r\n}<\/pre>\n<p>However, this file must be available in the output folder. That can be done by copying it as a Post-build event.<\/p>\n<pre class=\"lang:default decode:true \" >xcopy \/Y $(ProjectDir)CoreClassLib.runtimeconfig.json $(OutputPath)<\/pre>\n<p>After making these changes, the C++ console application works as expected.<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/cppclicore3.png\" alt=\"\" width=\"259\" height=\"80\" class=\"alignnone size-full wp-image-3636\" \/><\/p>\n<p>You can get the demo application for this article from here:<br \/>\nDownload: <div class=\"wp-block-button\">\n<a  data-e-Disable-Page-Transition=\"true\" class=\"dlm-download-link dlm-download-default wp-block-button__link wp-element-button\" title=\"Version 1.0\" href=\"https:\/\/mariusbancila.ro\/blog\/download\/3639\/?tmstv=1791236474\" rel=\"nofollow\" id=\"download-link-3639\" data-redirect=\"false\" >\n\tcppcli_core.zip\t(<span class=\"dlm-download-count-value\">8089 downloads<\/span>\n\t)\n<\/a>\n<\/div>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The .NET Core framework version 3.1 was released earlier this month, alongside with Visual Studio 2019 16.4 (which you must install in order to use .NET Core 3.1). Among the changes, it includes support for C++\/CLI components that can be used with .NET Core 3.x, in Visual Studio 2019 16.4. However, not everything works out of the box. In this article, I will show how you can create and consume C++\/CLI components targeting .NET Core 3.1.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[13,7,10],"tags":[454,451,361,55],"class_list":["post-3633","post","type-post","status-publish","format-standard","hentry","category-net","category-c","category-visual-studio","tag-net","tag-c","tag-ccli","tag-visualstudio"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"c++,c++\/cli,.net,visualstudio\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"C++\/CLI projects targeting .NET Core 3.x\" \/>\n\t\t<meta property=\"og:description\" content=\"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-18T15:55:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-03T06:55:00+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"C++\/CLI projects targeting .NET Core 3.x\" \/>\n\t\t<meta name=\"twitter:description\" content=\"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#article\",\"name\":\"C++\\\/CLI projects targeting .NET Core 3.x\",\"headline\":\"C++\\\/CLI projects targeting .NET Core 3.x\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/vsinstallercppcli.png\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#articleImage\",\"width\":685,\"height\":350},\"datePublished\":\"2019-12-18T17:55:36+02:00\",\"dateModified\":\"2020-06-03T08:55:00+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":9,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#webpage\"},\"articleSection\":\".NET, C++, Visual Studio, .NET, C++, C++\\\/CLI, VisualStudio\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#listItem\",\"name\":\"C++\\\/CLI projects targeting .NET Core 3.x\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#listItem\",\"position\":5,\"name\":\"C++\\\/CLI projects targeting .NET Core 3.x\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/\",\"name\":\"C++\\\/CLI projects targeting .NET Core 3.x\",\"description\":\"This article shows how to create C++\\\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2019\\\/12\\\/18\\\/cpp-cli-projects-targeting-net-core-3-x\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2019-12-18T17:55:36+02:00\",\"dateModified\":\"2020-06-03T08:55:00+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"C++\/CLI projects targeting .NET Core 3.x","description":"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/","robots":"max-image-preview:large","keywords":"c++,c++\/cli,.net,visualstudio","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#article","name":"C++\/CLI projects targeting .NET Core 3.x","headline":"C++\/CLI projects targeting .NET Core 3.x","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2019\/12\/vsinstallercppcli.png","@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#articleImage","width":685,"height":350},"datePublished":"2019-12-18T17:55:36+02:00","dateModified":"2020-06-03T08:55:00+02:00","inLanguage":"en-US","commentCount":9,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#webpage"},"articleSection":".NET, C++, Visual Studio, .NET, C++, C++\/CLI, VisualStudio"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#listItem","name":"C++\/CLI projects targeting .NET Core 3.x"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#listItem","position":5,"name":"C++\/CLI projects targeting .NET Core 3.x","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/","name":"C++\/CLI projects targeting .NET Core 3.x","description":"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2019-12-18T17:55:36+02:00","dateModified":"2020-06-03T08:55:00+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"C++\/CLI projects targeting .NET Core 3.x","og:description":"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.","og:url":"https:\/\/mariusbancila.ro\/blog\/2019\/12\/18\/cpp-cli-projects-targeting-net-core-3-x\/","article:published_time":"2019-12-18T15:55:36+00:00","article:modified_time":"2020-06-03T06:55:00+00:00","twitter:card":"summary","twitter:title":"C++\/CLI projects targeting .NET Core 3.x","twitter:description":"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application."},"aioseo_meta_data":{"post_id":"3633","title":"C++\/CLI projects targeting .NET Core 3.x","description":"This article shows how to create C++\/CLI components targeting the .NET Core 3.1 framework and how to properly consume it from a native C++ application.","keywords":[{"label":"C++","value":"C++"},{"label":"C++\/CLI","value":"C++\/CLI"},{"label":".NET","value":".NET"},{"label":"VisualStudio","value":"VisualStudio"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:03:35","updated":"2025-12-12 07:54:48","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":9,"uagb_excerpt":"The .NET Core framework version 3.1 was released earlier this month, alongside with Visual Studio 2019 16.4 (which you must install in order to use .NET Core 3.1). Among the changes, it includes support for C++\/CLI components that can be used with .NET Core 3.x, in Visual Studio 2019 16.4. However, not everything works out&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/net\/\" class=\"advgb-post-tax-term\">.NET<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">Visual Studio<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">.NET<\/span>","<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">Visual Studio<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">.NET<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">C++\/CLI<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">VisualStudio<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">.NET<\/span>","<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">C++\/CLI<\/span>","<span class=\"advgb-post-tax-term\">VisualStudio<\/span>"]}},"comment_count":"9","relative_dates":{"created":"Posted 7 years ago","modified":"Updated 6 years ago"},"absolute_dates":{"created":"Posted on December 18, 2019","modified":"Updated on June 3, 2020"},"absolute_dates_time":{"created":"Posted on December 18, 2019 5:55 pm","modified":"Updated on June 3, 2020 8:55 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-WB","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/3633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=3633"}],"version-history":[{"count":10,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/3633\/revisions"}],"predecessor-version":[{"id":3903,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/3633\/revisions\/3903"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=3633"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=3633"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=3633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}