質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

9768閲覧

VS2019でマネージドのDLLの作成方法がわからない

izmktr

総合スコア2856

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/05/10 08:15

編集2019/05/15 16:23

Visual Studio 2019 を使って、C#から呼び出されるdllを作成しています
ただ、最近のVisualStudioはCLIのDLLのテンプレートがなくなっていて、
どのように設定すればいいのかわかりません

現在、以下の方法でC++/CLIのソースをコンパイルしています

新規プロジェクト→空のプロジェクト(C++)

プロパティを以下のように設定
全般
構成の種類:ダイナミックライブラリ
文字セット:Unicode
共通言語ランタイムサポート:共通言語ランタイムサポート(/clr)

C/C++ コマンドライン
/Zc:twoPhase-

ソース

C++/CLI

1#include <iostream> 2#include <msclr/marshal_cppstd.h> 3 4public ref class Sample 5{ 6public: 7 Sample(); 8 9 void Print(System::String^ str) { 10 std::wstring wstr = msclr::interop::marshal_as <std::wstring>(str); 11 12// System::Console::WriteLine(str); 13 std::wcout << wstr << std::endl; 14 } 15};

こうして作ったdllを以下のC#のプロジェクトから呼び出そうとしています

Csharp

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Sample s = new Sample(); 6 7 s.Print("てすとてすと"); 8 9 } 10 } 11}

これをコンパイルすると以下のエラーが出ますし、Console::Writelineのコメントを外すと例外も発生するので、正常に呼び出されてないように見えます。どういう設定をすればいいのでしょうか

構築されているプロジェクトのプロセッサ アーキテクチャ "MSIL" と、参照 "ManagedDll, Version=0.0.0.0, Culture=neutral, processorArchitecture=AMD64" のプロセッサ アーキテクチャ "x86" の間には不一致がありました。この不一致は、ランタイム エラーを発生させる可能性があります。

[追記]
過去のVSのテンプレート画面です
見ての通り、左側の欄にVisual C++ → CLIという区分が見えます
ほしいのはこれに値するテンプレートになります
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/05/13 12:26

> VisualStudioはCLIのDLLのテンプレートがなくなって 手元の VS2019 Communittyでは、あるようですが、違いますか? それと、指摘のエラーとはありますが、Warningなので、実行は可能なようです。
izmktr

2019/05/14 02:19 編集

すいません、VS2019からはテンプレートは個別にインストールできるようになったので、 どれをインストールすれば追加されるのかわかりません ですから、正式な名前を教えてもらえますか? 「共通言語ランタイムサポートを使用しない」となっているものばかりで 最初から「共通言語ランタイムサポートを使用する」になっているテンプレートは見当たらないです あと、確かにエラーではないものの、実際に実行してみると例外をはくので根本的な問題は解決していません
pepperleaf

2019/05/14 11:28

今、メンテナンスしてるアプリが同様の状況。 動いてるので、放置なのですが、気になって仕方が無い。(動いてるので、対応の優先順位は低い)
izmktr

2019/05/15 04:04

>手元の VS2019 Communittyでは、あるようですが、違いますか? これに関する情報をもらえると助かります
guest

回答2

0

ベストアンサー

Visual Studio 2019 C++/.NETフォームプログラミング

ワークロードで .NET デスクトップ開発と C++ によるデスクトップ開発を選択
オプションで v142 ビルドツールの C++/CLI サポートを選択

ということらしいですが、これでどうでしょうか?
もしこれでもテンプレートがインストールされなかった場合、Visual Studio で過去のプロジェクトを開いて適当に編集し、メニュー→プロジェクト→テンプレートのエクスポートで新しくテンプレートを作ってください。

なお、本題に関係ありませんが

Visual Studio 2017 Visual C++ による VC++/CLI GUI の開発

VC++/CLI は .NET CLR 上で動作するものですが、GUI も開発できます。しかし、VC++ で GUI を作る人はほとんどいなかったのか、すでにオワコン状態です。以前は確かもっと厚くサポートされていたと思いますが、現在ではオマケのような感じです。

さらに、Visual Studio 2017 での開発においても、何かと問題があるように見えます。例えば、

  • 一部のコントロールがちゃんと動作しない。(少なくとも C# や VB.NET と動作が異なる)
  • ウィンドウプロシージャを手動で書いてやる必要がある。
  • フォームのデザイン画面を最初に開いたとき必ずエラーになる。。
  • プロジェクトのプロパティを手動で修正する必要がある。

投稿2019/05/15 21:43

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izmktr

2019/05/16 10:33 編集

ありがとうございます そちらの方法で無事C++/CLIのテンプレートが追加され、問題なく実行できるdllが作成できました 正直、グルーコードの生成が目的ですし、そちらに関しては今でも使用できると思ってます WindowsForm関連ならC++/CLIでやるよりC#で書くべきだと思います
guest

0

コメントに画像の貼り方が分からない(ある?)ので、こちらに置きます。
新規プロジェクト

こんな感じで、選択できました。
インストール時の設定はよく覚えていませんが、C++, C# は選択してます。
(本日、MSのアップデート多数で、PCがなんか重たい....)


C++/CLRのライブラリの作成に更新しました。
(dll の作成も確認済み)

なお、

構築されているプロジェクトのプロセッサ アーキテクチャ "MSIL" と、参照 "ManagedDll, Version=0.0.0.0, Culture=neutral, processorArchitecture=AMD64" のプロセッサ アーキテクチャ "x86" の間には不一致がありました。この不一致は、ランタイム エラーを発生させる可能性があります。

については、再度、調べたら、exe と dllの関係が "Any CPU" と "x64" だったりすると発生するようです。こちらの環境はほぼ、それに該当するするので、無視するしかなさそう(or x64に揃える)です。

投稿2019/05/15 12:45

編集2019/05/16 12:56
pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izmktr

2019/05/15 16:29

質問の方に、過去はどのようなものだったかの画像を追加しました そちらのテンプレートはアンマネージドのDLLをつくるもので、 作りたいものはマネージドのDLLですから、どこを変更すればマネージドのDLLになるのか、というのが質問の趣旨です #マネージドとか、CLRとかの単語の意味、理解されてますよね…?
pepperleaf

2019/05/16 12:50

C++とあったところで、アンマネージドと思ってしまいました。申し訳ないです。 なお、テンプレートを見直したところ、CLRもあったので、そちらの画像に更新しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問