<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://mochiuwiki.e2.valueserver.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=192.168.1.17</id>
	<title>MochiuWiki : SUSE, EC, PCB - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="http://mochiuwiki.e2.valueserver.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=192.168.1.17"/>
	<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/192.168.1.17"/>
	<updated>2026-09-07T02:46:08Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Nginx(RHEL)&amp;diff=507</id>
		<title>インストール - Nginx(RHEL)</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Nginx(RHEL)&amp;diff=507"/>
		<updated>2019-12-07T17:02:01Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: ページの作成:「== 概要 ==   == リポジトリの設定 == リポジトリを追加するので、nginx.repoファイルを作成する。&amp;lt;br&amp;gt;  sudo nano /etc/yum.repos.d/nginx.repo &amp;lt;…」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== リポジトリの設定 ==&lt;br /&gt;
リポジトリを追加するので、nginx.repoファイルを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo nano /etc/yum.repos.d/nginx.repo&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
上記で作成したnginx.repoファイルに以下の内容を書き込み保存する。&amp;lt;br&amp;gt;&lt;br /&gt;
 [nginx]&lt;br /&gt;
 name=nginx repo&lt;br /&gt;
 baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/&lt;br /&gt;
 gpgcheck=0&lt;br /&gt;
 enabled=1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== インストールと起動 ==&lt;br /&gt;
以下のコマンドを入力して、Nginxをインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install nginx&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
インストールしたNginxのバージョンを確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 nginx -v&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
自動起動設定とNginxの起動を行う。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo systemctl enable nginx&lt;br /&gt;
 sudo systemctl start nginx&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
デフォルトページの表示の確認をする。&amp;lt;br&amp;gt;&lt;br /&gt;
http://CentOSのコンピュータ名/&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
上記のindex.htmlのデフォルトのパス&amp;lt;br&amp;gt;&lt;br /&gt;
 /usr/share/nginx/html/index.html&lt;br /&gt;
Nginxの設定ファイルのパス&amp;lt;br&amp;gt;&lt;br /&gt;
 /etc/nginx/conf.d/default.conf&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
簡単なリバースプロキシ&amp;lt;br&amp;gt;&lt;br /&gt;
/etc/nginx/conf.d 以下に XXX.confという命名でファイルを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
ココでは server.conf とし、80 番で受けたリクエストを 8000 番に転送する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo nano /etc/nginx/conf.d/server.conf&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    # アクセス可能なIPアドレスもしくはドメイン&lt;br /&gt;
    server_name hogehoge.com;&lt;br /&gt;
    proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header Host $http_host;&lt;br /&gt;
    proxy_redirect off;&lt;br /&gt;
    proxy_max_temp_file_size 0;&lt;br /&gt;
    location / {&lt;br /&gt;
       proxy_pass http://localhost:8000;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nginxの基本コマンド ==&lt;br /&gt;
起動&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo systemctl start nginx&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
停止&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo systemctl stop nginx&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
再起動&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo systemctl restart nginx&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
再起動しても設定ファイルが反映されない場合&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo nginx -s reload&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
状態の確認&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo systemctl status nginx&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Git&amp;diff=506</id>
		<title>インストール - Git</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Git&amp;diff=506"/>
		<updated>2019-12-07T10:05:03Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* ビルドしてインストール */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
aptやyum等のLinuxのパッケージマネージャーでインストールしたGitはバージョンが古いことが多い。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ一覧を返すコマンド(yum list installedまたはrpm -qa)を使用して、&amp;lt;br&amp;gt;&lt;br /&gt;
文字列検索するgrepコマンドにパイプで渡すことで探したいパッケージ名の一覧を得ることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Gitのバージョンが古くても最低限のことは問題ないが、Git2.8以降では、user.useConfigOnly という設定が追加され、&amp;lt;br&amp;gt;&lt;br /&gt;
これを有効にすることで、ユーザ名やメールアドレスを設定していない時に環境変数を使用して勝手にユーザ情報を参照してしまうことを防ぐことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 既存のGitをアンインストール ==&lt;br /&gt;
既にパッケージマネージャーでGitをインストールしている場合は、&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力してアンインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum remove git&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== rpmパッケージの検査に必要なライブラリをインストール ==&lt;br /&gt;
まず、必要なライブラリをインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel autoconf asciidoc xmlto docbook2X make gcc&lt;br /&gt;
 sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ソースコードをダウンロード ==&lt;br /&gt;
以下のGitHubのWebサイトにアクセスして、最新のGitのソースコードをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
https://github.com/git/git/releases&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ビルドしてインストール ==&lt;br /&gt;
ダウンロードしたGitのソースコードを展開して、展開されたディレクトリに移動する。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、以下のコマンドを入力してビルドおよびインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 make configure&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --prefix=/usr/local&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 make all doc info&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo make install install-doc install-html install-info&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認 ==&lt;br /&gt;
以下のコマンドを入力して、インストールしたGitのバージョンを確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 git –version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Git&amp;diff=505</id>
		<title>インストール - Git</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Git&amp;diff=505"/>
		<updated>2019-12-07T10:01:08Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: ページの作成:「== 概要 == aptやyum等のLinuxのパッケージマネージャーでインストールしたGitはバージョンが古いことが多い。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; パッケージ…」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
aptやyum等のLinuxのパッケージマネージャーでインストールしたGitはバージョンが古いことが多い。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パッケージ一覧を返すコマンド(yum list installedまたはrpm -qa)を使用して、&amp;lt;br&amp;gt;&lt;br /&gt;
文字列検索するgrepコマンドにパイプで渡すことで探したいパッケージ名の一覧を得ることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Gitのバージョンが古くても最低限のことは問題ないが、Git2.8以降では、user.useConfigOnly という設定が追加され、&amp;lt;br&amp;gt;&lt;br /&gt;
これを有効にすることで、ユーザ名やメールアドレスを設定していない時に環境変数を使用して勝手にユーザ情報を参照してしまうことを防ぐことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 既存のGitをアンインストール ==&lt;br /&gt;
既にパッケージマネージャーでGitをインストールしている場合は、&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力してアンインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum remove git&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== rpmパッケージの検査に必要なライブラリをインストール ==&lt;br /&gt;
まず、必要なライブラリをインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel autoconf asciidoc xmlto docbook2X make gcc&lt;br /&gt;
 sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ソースコードをダウンロード ==&lt;br /&gt;
以下のGitHubのWebサイトにアクセスして、最新のGitのソースコードをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
https://github.com/git/git/releases&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ビルドしてインストール ==&lt;br /&gt;
ダウンロードしたGitのソースコードを展開して、展開されたディレクトリに移動する。&amp;lt;br&amp;gt;&lt;br /&gt;
その後、以下のコマンドを入力してビルドおよびインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 make configure&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --prefix=/usr&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 make all doc info&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo make install install-doc install-html install-info&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認 ==&lt;br /&gt;
以下のコマンドを入力して、インストールしたGitのバージョンを確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 git –version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E8%A8%AD%E5%AE%9A_-_%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB&amp;diff=499</id>
		<title>設定 - レガシーカーネル</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E8%A8%AD%E5%AE%9A_-_%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB&amp;diff=499"/>
		<updated>2019-12-07T08:55:45Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
一般的に、カーネルをアップデートしても古いカーネルは削除せず、&amp;lt;br&amp;gt;&lt;br /&gt;
新バージョンとともに旧バージョンのカーネルもGRUBから起動できるようにすることが多い。&amp;lt;br&amp;gt;&lt;br /&gt;
新バージョンがうまく動かない場合を考えると安心できるシステムだが、カーネルのアップデートが比較的短い間隔で行われるディストリビューションでは、&amp;lt;br&amp;gt;&lt;br /&gt;
ディスクスペースが圧迫されてしまうしGRUBのメニューも煩雑になる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 古いカーネルを削除する ==&lt;br /&gt;
CentOSでは、yum-utilsというパッケージが用意されており、その中のpackage-cleanupコマンドを実行すれば、古いカーネルを簡単に削除できる。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、以下のコマンドを入力し、yum-utilsをインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install yum-utils&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
yum-utilsのインストールが完了したら、--oldkernelsオプションを付けてpackage-cleanupコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo package-cleanup --oldkernels&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
初期設定では、最新カーネルと1世代前のカーネルを残し、それよりも古いカーネル(kernelとkernel-devel)が削除される。&amp;lt;br&amp;gt;&lt;br /&gt;
もっと古いカーネルも残したい場合は、”package-cleanup”コマンド実行時に、”--count=残すカーネル数”を追加する。&amp;lt;br&amp;gt;&lt;br /&gt;
例えば、最新版および2世代前のカーネルまで残すなら、以下のようにする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo package-cleanup --oldkernels --count=3&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E8%A8%AD%E5%AE%9A_-_%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB&amp;diff=498</id>
		<title>設定 - レガシーカーネル</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E8%A8%AD%E5%AE%9A_-_%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB&amp;diff=498"/>
		<updated>2019-12-07T08:55:29Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: ページの作成:「== 概要 == 一般的に、カーネルをアップデートしても古いカーネルは削除せず、&amp;lt;br&amp;gt; 新バージョンとともに旧バージョンのカー…」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
一般的に、カーネルをアップデートしても古いカーネルは削除せず、&amp;lt;br&amp;gt;&lt;br /&gt;
新バージョンとともに旧バージョンのカーネルもGRUBから起動できるようにすることが多い。&amp;lt;br&amp;gt;&lt;br /&gt;
新バージョンがうまく動かない場合を考えると安心できるシステムだが、カーネルのアップデートが比較的短い間隔で行われるディストリビューションでは、&amp;lt;br&amp;gt;&lt;br /&gt;
ディスクスペースが圧迫されてしまうしGRUBのメニューも煩雑になる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 古いカーネルを削除する ==&lt;br /&gt;
CentOSでは、yum-utilsというパッケージが用意されており、その中のpackage-cleanupコマンドを実行すれば、古いカーネルを簡単に削除できる。&amp;lt;br&amp;gt;&lt;br /&gt;
まず、以下のコマンドを入力し、yum-utilsをインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install yum-utils&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
yum-utilsのインストールが完了したら、--oldkernelsオプションを付けてpackage-cleanupコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo package-cleanup --oldkernels&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
初期設定では、最新カーネルと1世代前のカーネルを残し、それよりも古いカーネル(kernelとkernel-devel)が削除される。&amp;lt;br&amp;gt;&lt;br /&gt;
もっと古いカーネルも残したい場合は、”package-cleanup”コマンド実行時に、”--count=残すカーネル数”を追加する。&amp;lt;br&amp;gt;&lt;br /&gt;
例えば、最新版および2世代前のカーネルまで残すなら、以下のようにする。&amp;lt;br&amp;gt;&lt;br /&gt;
“sudo package-cleanup --oldkernels --count=3”&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=497</id>
		<title>インストール - Xdebug</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=497"/>
		<updated>2019-12-06T12:39:59Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* 設定方法 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install php73-pecl-xdebug.x86_64&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== インストール方法 ==&lt;br /&gt;
まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力して解凍する。&amp;lt;br&amp;gt;&lt;br /&gt;
 tar zxvf xdebug-x.x.x.tgz&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
解凍したXdebugのディレクトリに移動し、phpizeコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 cd xdebug-2.8.1&lt;br /&gt;
 phpize&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== configureを実行する =====&lt;br /&gt;
configureというシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、&amp;lt;br&amp;gt;&lt;br /&gt;
インストール対象となるシステム特有の機能や情報をチェックし、チェック状況を記述したMakefileを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、configureに失敗する場合は、コンパイルに必要なライブラリやヘッダファイル等が不足している事がほとんどなので、&amp;lt;br&amp;gt;&lt;br /&gt;
エラーメッセージの内容を確認し、必要なパッケージを事前にインストールしておく。&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --enable-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== makeコマンドを実行する =====&lt;br /&gt;
configureの実行により作成されたMakefileを元に、makeコマンドを実行することで、ソースファイルのコンパイルを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
コンパイル時にエラーが表示されるようであれば、エラー内容を確認し、configure実行時に必要なパラメータが不足していないか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== make installコマンドを実行する(インストール) =====&lt;br /&gt;
makeコマンド実行時にエラーが表示されなければコンパイル完了なので、(コンパイル途中に警告メッセージが表示される場合がある、これは無視してもよい)&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成されたxdebug.soファイルを/usr/local/binディレクトリにコピーする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo cp -a modules/xdebug.so /usr/lib64/php/modules&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 設定方法 ==&lt;br /&gt;
PHPのXdebug設定ファイルを開く。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo gedit /etc/php.d/15-xdebug.ini&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Xdebug設定ファイルを編集する。&amp;lt;br&amp;gt;&lt;br /&gt;
※OPCacheを使用する場合は、OPCacheの設定行の後にzend_extensionを入力すること。&amp;lt;br&amp;gt;&lt;br /&gt;
 1行目を編集&lt;br /&gt;
 zend_extension = /usr/lib64/php/modules/xdebug.so&lt;br /&gt;
&lt;br /&gt;
 最後尾の行に以下を追加&lt;br /&gt;
 [xdebug]&lt;br /&gt;
 xdebug.dump_undefined = 1&lt;br /&gt;
 xdebug.remote_log=&amp;quot;/tmp/xdebug.log&amp;quot;&lt;br /&gt;
 xdebug.remote_enable = 1&lt;br /&gt;
 xdebug.remote_host=localhost&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.remote_handler=dbgp&lt;br /&gt;
 xdebug.remote_mode=req&lt;br /&gt;
 xdebug.remote_autostart = 1&lt;br /&gt;
 xdebug.idekey=VSCODE&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
以下のコマンドを入力して、xdebugと表示されているならば成功である。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -m | grep xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=496</id>
		<title>インストール - Xdebug</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=496"/>
		<updated>2019-12-06T12:39:14Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* make installコマンドを実行する(インストール) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install php73-pecl-xdebug.x86_64&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== インストール方法 ==&lt;br /&gt;
まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力して解凍する。&amp;lt;br&amp;gt;&lt;br /&gt;
 tar zxvf xdebug-x.x.x.tgz&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
解凍したXdebugのディレクトリに移動し、phpizeコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 cd xdebug-2.8.1&lt;br /&gt;
 phpize&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== configureを実行する =====&lt;br /&gt;
configureというシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、&amp;lt;br&amp;gt;&lt;br /&gt;
インストール対象となるシステム特有の機能や情報をチェックし、チェック状況を記述したMakefileを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、configureに失敗する場合は、コンパイルに必要なライブラリやヘッダファイル等が不足している事がほとんどなので、&amp;lt;br&amp;gt;&lt;br /&gt;
エラーメッセージの内容を確認し、必要なパッケージを事前にインストールしておく。&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --enable-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== makeコマンドを実行する =====&lt;br /&gt;
configureの実行により作成されたMakefileを元に、makeコマンドを実行することで、ソースファイルのコンパイルを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
コンパイル時にエラーが表示されるようであれば、エラー内容を確認し、configure実行時に必要なパラメータが不足していないか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== make installコマンドを実行する(インストール) =====&lt;br /&gt;
makeコマンド実行時にエラーが表示されなければコンパイル完了なので、(コンパイル途中に警告メッセージが表示される場合がある、これは無視してもよい)&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成されたxdebug.soファイルを/usr/local/binディレクトリにコピーする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo cp -a modules/xdebug.so /usr/lib64/php/modules&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 設定方法 ==&lt;br /&gt;
PHPのXdebug設定ファイルを開く。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo gedit /etc/php.d/15-xdebug.ini&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Xdebug設定ファイルを編集する。&amp;lt;br&amp;gt;&lt;br /&gt;
※OPCacheを使用する場合は、OPCacheの設定行の後にzend_extensionを入力すること。&amp;lt;br&amp;gt;&lt;br /&gt;
 1行目を編集&lt;br /&gt;
 zend_extension = /usr/local/bin/xdebug.so&lt;br /&gt;
&lt;br /&gt;
 最後尾の行に以下を追加&lt;br /&gt;
 [xdebug]&lt;br /&gt;
 xdebug.dump_undefined = 1&lt;br /&gt;
 xdebug.remote_log=&amp;quot;/tmp/xdebug.log&amp;quot;&lt;br /&gt;
 xdebug.remote_enable = 1&lt;br /&gt;
 xdebug.remote_host=localhost&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.remote_handler=dbgp&lt;br /&gt;
 xdebug.remote_mode=req&lt;br /&gt;
 xdebug.remote_autostart = 1&lt;br /&gt;
 xdebug.idekey=VSCODE&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
以下のコマンドを入力して、xdebugと表示されているならば成功である。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -m | grep xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=495</id>
		<title>インストール - Xdebug</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=495"/>
		<updated>2019-12-06T12:15:03Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* 設定方法 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install php73-pecl-xdebug.x86_64&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== インストール方法 ==&lt;br /&gt;
まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力して解凍する。&amp;lt;br&amp;gt;&lt;br /&gt;
 tar zxvf xdebug-x.x.x.tgz&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
解凍したXdebugのディレクトリに移動し、phpizeコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 cd xdebug-2.8.1&lt;br /&gt;
 phpize&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== configureを実行する =====&lt;br /&gt;
configureというシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、&amp;lt;br&amp;gt;&lt;br /&gt;
インストール対象となるシステム特有の機能や情報をチェックし、チェック状況を記述したMakefileを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、configureに失敗する場合は、コンパイルに必要なライブラリやヘッダファイル等が不足している事がほとんどなので、&amp;lt;br&amp;gt;&lt;br /&gt;
エラーメッセージの内容を確認し、必要なパッケージを事前にインストールしておく。&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --enable-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== makeコマンドを実行する =====&lt;br /&gt;
configureの実行により作成されたMakefileを元に、makeコマンドを実行することで、ソースファイルのコンパイルを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
コンパイル時にエラーが表示されるようであれば、エラー内容を確認し、configure実行時に必要なパラメータが不足していないか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== make installコマンドを実行する(インストール) =====&lt;br /&gt;
makeコマンド実行時にエラーが表示されなければコンパイル完了なので、(コンパイル途中に警告メッセージが表示される場合がある、これは無視してもよい)&amp;lt;br&amp;gt;&lt;br /&gt;
 make install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成されたxdebug.soファイルを/usr/local/binディレクトリにコピーする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo cp -a modules/xdebug.so /usr/local/bin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 設定方法 ==&lt;br /&gt;
PHPのXdebug設定ファイルを開く。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo gedit /etc/php.d/15-xdebug.ini&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Xdebug設定ファイルを編集する。&amp;lt;br&amp;gt;&lt;br /&gt;
※OPCacheを使用する場合は、OPCacheの設定行の後にzend_extensionを入力すること。&amp;lt;br&amp;gt;&lt;br /&gt;
 1行目を編集&lt;br /&gt;
 zend_extension = /usr/local/bin/xdebug.so&lt;br /&gt;
&lt;br /&gt;
 最後尾の行に以下を追加&lt;br /&gt;
 [xdebug]&lt;br /&gt;
 xdebug.dump_undefined = 1&lt;br /&gt;
 xdebug.remote_log=&amp;quot;/tmp/xdebug.log&amp;quot;&lt;br /&gt;
 xdebug.remote_enable = 1&lt;br /&gt;
 xdebug.remote_host=localhost&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.remote_handler=dbgp&lt;br /&gt;
 xdebug.remote_mode=req&lt;br /&gt;
 xdebug.remote_autostart = 1&lt;br /&gt;
 xdebug.idekey=VSCODE&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
以下のコマンドを入力して、xdebugと表示されているならば成功である。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -m | grep xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=494</id>
		<title>インストール - Xdebug</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=494"/>
		<updated>2019-12-06T11:27:22Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* 設定方法 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install php73-pecl-xdebug.x86_64&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== インストール方法 ==&lt;br /&gt;
まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力して解凍する。&amp;lt;br&amp;gt;&lt;br /&gt;
 tar zxvf xdebug-x.x.x.tgz&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
解凍したXdebugのディレクトリに移動し、phpizeコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 cd xdebug-2.8.1&lt;br /&gt;
 phpize&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== configureを実行する =====&lt;br /&gt;
configureというシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、&amp;lt;br&amp;gt;&lt;br /&gt;
インストール対象となるシステム特有の機能や情報をチェックし、チェック状況を記述したMakefileを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、configureに失敗する場合は、コンパイルに必要なライブラリやヘッダファイル等が不足している事がほとんどなので、&amp;lt;br&amp;gt;&lt;br /&gt;
エラーメッセージの内容を確認し、必要なパッケージを事前にインストールしておく。&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --enable-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== makeコマンドを実行する =====&lt;br /&gt;
configureの実行により作成されたMakefileを元に、makeコマンドを実行することで、ソースファイルのコンパイルを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
コンパイル時にエラーが表示されるようであれば、エラー内容を確認し、configure実行時に必要なパラメータが不足していないか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== make installコマンドを実行する(インストール) =====&lt;br /&gt;
makeコマンド実行時にエラーが表示されなければコンパイル完了なので、(コンパイル途中に警告メッセージが表示される場合がある、これは無視してもよい)&amp;lt;br&amp;gt;&lt;br /&gt;
 make install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成されたxdebug.soファイルを/usr/local/binディレクトリにコピーする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo cp -a modules/xdebug.so /usr/local/bin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 設定方法 ==&lt;br /&gt;
PHPのXdebug設定ファイルを開く。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo gedit /etc/php.d/15-xdebug.ini&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Xdebug設定ファイルを編集する。&amp;lt;br&amp;gt;&lt;br /&gt;
※OPCacheを使用する場合は、OPCacheの設定行の後にzend_extensionを入力すること。&amp;lt;br&amp;gt;&lt;br /&gt;
 1行目を編集&lt;br /&gt;
 zend_extension = /usr/local/bin/xdebug.so&lt;br /&gt;
&lt;br /&gt;
 最後尾の行に以下を追加&lt;br /&gt;
 xdebug.dump_undefined = 1&lt;br /&gt;
 xdebug.remote_log=&amp;quot;/tmp/xdebug.log&amp;quot;&lt;br /&gt;
 xdebug.profiler_enable = 1&lt;br /&gt;
 xdebug.remote_enable=on&lt;br /&gt;
 xdebug.remote_host=localhost&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.remote_handler=dbgp&lt;br /&gt;
 xdebug.remote_autostart = 1&lt;br /&gt;
 xdebug.remote_mode=req&lt;br /&gt;
 xdebug.remote_connect_back=on&lt;br /&gt;
 xdebug.idekey=editor-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
以下のコマンドを入力して、xdebugと表示されているならば成功である。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -m | grep xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=493</id>
		<title>インストール - Xdebug</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=493"/>
		<updated>2019-12-06T11:09:49Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum install php73-pecl-xdebug.x86_64&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== インストール方法 ==&lt;br /&gt;
まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力して解凍する。&amp;lt;br&amp;gt;&lt;br /&gt;
 tar zxvf xdebug-x.x.x.tgz&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
解凍したXdebugのディレクトリに移動し、phpizeコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 cd xdebug-2.8.1&lt;br /&gt;
 phpize&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== configureを実行する =====&lt;br /&gt;
configureというシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、&amp;lt;br&amp;gt;&lt;br /&gt;
インストール対象となるシステム特有の機能や情報をチェックし、チェック状況を記述したMakefileを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、configureに失敗する場合は、コンパイルに必要なライブラリやヘッダファイル等が不足している事がほとんどなので、&amp;lt;br&amp;gt;&lt;br /&gt;
エラーメッセージの内容を確認し、必要なパッケージを事前にインストールしておく。&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --enable-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== makeコマンドを実行する =====&lt;br /&gt;
configureの実行により作成されたMakefileを元に、makeコマンドを実行することで、ソースファイルのコンパイルを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
コンパイル時にエラーが表示されるようであれば、エラー内容を確認し、configure実行時に必要なパラメータが不足していないか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== make installコマンドを実行する(インストール) =====&lt;br /&gt;
makeコマンド実行時にエラーが表示されなければコンパイル完了なので、(コンパイル途中に警告メッセージが表示される場合がある、これは無視してもよい)&amp;lt;br&amp;gt;&lt;br /&gt;
 make install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成されたxdebug.soファイルを/usr/local/binディレクトリにコピーする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo cp -a modules/xdebug.so /usr/local/bin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 設定方法 ==&lt;br /&gt;
PHPのXdebug設定ファイルを開く。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo gedit /etc/php.d/15-xdebug.ini&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Xdebug設定ファイルを編集する。&amp;lt;br&amp;gt;&lt;br /&gt;
※OPCacheを使用する場合は、OPCacheの設定行の後にzend_extensionを入力すること。&amp;lt;br&amp;gt;&lt;br /&gt;
 1行目を編集&lt;br /&gt;
 zend_extension = /usr/local/bin/xdebug.so&lt;br /&gt;
&lt;br /&gt;
 最後尾の行に以下を追加&lt;br /&gt;
 xdebug.remote_log=&amp;quot;/tmp/xdebug.log&amp;quot;&lt;br /&gt;
 xdebug.profiler_enable = 1&lt;br /&gt;
 xdebug.remote_enable=on&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.remote_autostart=0&lt;br /&gt;
 xdebug.remote_connect_back=on&lt;br /&gt;
 xdebug.idekey=editor-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
以下のコマンドを入力して、xdebugと表示されているならば成功である。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -m | grep xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_PHP&amp;diff=491</id>
		<title>インストール - PHP</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_PHP&amp;diff=491"/>
		<updated>2019-12-06T08:27:30Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: ページの作成:「== 概要 == CentOS7の標準リポジトリのPHPは5.4だが、PHPの現時点での最新バージョンは7.3.6である。(2019/6/17)&amp;lt;br&amp;gt; また、PHP7以降は大…」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
CentOS7の標準リポジトリのPHPは5.4だが、PHPの現時点での最新バージョンは7.3.6である。(2019/6/17)&amp;lt;br&amp;gt;&lt;br /&gt;
また、PHP7以降は大幅な改良がされており、実行速度をはじめ様々なものがアップデートされているので、特別な事情がない限りはアップグレードした方がよい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP7のインストール ==&lt;br /&gt;
PHP5をアンインストールするため、以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
このとき、php.iniファイルを変更している場合はバックアップを取る。&amp;lt;br&amp;gt;&lt;br /&gt;
これは、新しいPHPをインストールした時点でphp.iniファイルが上書きされるためである。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum remove php-*&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
次に、PHP7をインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
インストールは、--enablerepoオプションを付加して、以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
アップデート後は、php.iniファイルが上書きされているのでバックアップから復元する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum --enablerepo=remi-php73 install php php-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php73-devel&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
最後に、インストールされたPHPのバージョンを確認するため、以下のコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -v&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
運用していく上で必要な関連パッケージがあれば、適宜追加する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== インストール時の注意点 ==&lt;br /&gt;
PHP7をインストールするとき、旧バージョンのPHPが指定されることを防ぐため、一旦すべてのリポジトリを無効化し、PHP7のリポジトリを指定する。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum --disablerepo=* --enablerepo=remi,remi-php73 install php hp-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php73-devel&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
EPELリポジトリおよびRemiリポジトリの追加方法で、EPELリポジトリの公開鍵を取得するためにlibargon2をインストールしているが、&amp;lt;br&amp;gt;&lt;br /&gt;
このパッケージは、PHP7をインストールする際に依存性パッケージとして必要になる。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、libargon2をインストールせずにPHPをインストールしようとすると、恐らくEPELが無いために依存性が解決されない。&amp;lt;br&amp;gt;&lt;br /&gt;
PHP7をインストールする前に、以下のコマンドを実行してlibargon2をインストールする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo yum --disablerepo=* --enablerepo=epel install libargon2&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=490</id>
		<title>インストール - Xdebug</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=490"/>
		<updated>2019-12-06T08:20:57Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* インストール方法 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== インストール方法 ==&lt;br /&gt;
まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力して解凍する。&amp;lt;br&amp;gt;&lt;br /&gt;
 tar zxvf xdebug-x.x.x.tgz&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
解凍したXdebugのディレクトリに移動し、phpizeコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 cd xdebug-2.8.1&lt;br /&gt;
 phpize&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== configureを実行する =====&lt;br /&gt;
configureというシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、&amp;lt;br&amp;gt;&lt;br /&gt;
インストール対象となるシステム特有の機能や情報をチェックし、チェック状況を記述したMakefileを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、configureに失敗する場合は、コンパイルに必要なライブラリやヘッダファイル等が不足している事がほとんどなので、&amp;lt;br&amp;gt;&lt;br /&gt;
エラーメッセージの内容を確認し、必要なパッケージを事前にインストールしておく。&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --enable-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== makeコマンドを実行する =====&lt;br /&gt;
configureの実行により作成されたMakefileを元に、makeコマンドを実行することで、ソースファイルのコンパイルを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
コンパイル時にエラーが表示されるようであれば、エラー内容を確認し、configure実行時に必要なパラメータが不足していないか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== make installコマンドを実行する(インストール) =====&lt;br /&gt;
makeコマンド実行時にエラーが表示されなければコンパイル完了なので、(コンパイル途中に警告メッセージが表示される場合がある、これは無視してもよい)&amp;lt;br&amp;gt;&lt;br /&gt;
 make install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成されたxdebug.soファイルを/usr/local/binディレクトリにコピーする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo cp -a modules/xdebug.so /usr/local/bin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 設定方法 ==&lt;br /&gt;
PHPのXdebug設定ファイルを開く。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo gedit /etc/php.d/15-xdebug.ini&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Xdebug設定ファイルを編集する。&amp;lt;br&amp;gt;&lt;br /&gt;
※OPCacheを使用する場合は、OPCacheの設定行の後にzend_extensionを入力すること。&amp;lt;br&amp;gt;&lt;br /&gt;
 1行目を編集&lt;br /&gt;
 zend_extension = /usr/local/bin/xdebug.so&lt;br /&gt;
&lt;br /&gt;
 最後尾の行に以下を追加&lt;br /&gt;
 xdebug.remote_log=&amp;quot;/tmp/xdebug.log&amp;quot;&lt;br /&gt;
 xdebug.profiler_enable = 1&lt;br /&gt;
 xdebug.remote_enable=on&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.remote_autostart=0&lt;br /&gt;
 xdebug.remote_connect_back=on&lt;br /&gt;
 xdebug.idekey=editor-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
以下のコマンドを入力して、xdebugと表示されているならば成功である。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -m | grep xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=489</id>
		<title>インストール - Xdebug</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_-_Xdebug&amp;diff=489"/>
		<updated>2019-12-06T08:18:38Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: ページの作成:「== 概要 ==   == インストール方法 == まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードす…」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== インストール方法 ==&lt;br /&gt;
まず、Xdebugの[https://xdebug.org/download サイト]に行き、Xdebugのソースファイルをダウンロードする。&amp;lt;br&amp;gt;&lt;br /&gt;
以下のコマンドを入力して解凍する。&amp;lt;br&amp;gt;&lt;br /&gt;
 tar zxvf xdebug-x.x.x.tgz&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
解凍したXdebugのディレクトリに移動し、phpizeコマンドを実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
 cd xdebug-2.8.1&lt;br /&gt;
 phpize&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== configureを実行する =====&lt;br /&gt;
configureというシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、&amp;lt;br&amp;gt;&lt;br /&gt;
インストール対象となるシステム特有の機能や情報をチェックし、チェック状況を記述したMakefileを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
もし、configureに失敗する場合は、コンパイルに必要なライブラリやヘッダファイル等が不足している事がほとんどなので、&amp;lt;br&amp;gt;&lt;br /&gt;
エラーメッセージの内容を確認し、必要なパッケージを事前にインストールしておく。&amp;lt;br&amp;gt;&lt;br /&gt;
 ./configure --enable-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== makeコマンドを実行する =====&lt;br /&gt;
configureの実行により作成されたMakefileを元に、makeコマンドを実行することで、ソースファイルのコンパイルを行う。&amp;lt;br&amp;gt;&lt;br /&gt;
コンパイル時にエラーが表示されるようであれば、エラー内容を確認し、configure実行時に必要なパラメータが不足していないか確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
 make&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
===== make installコマンドを実行する(インストール) =====&lt;br /&gt;
makeコマンド実行時にエラーが表示されなければコンパイル完了なので、(コンパイル途中に警告メッセージが表示される場合がある、これは無視してもよい)&amp;lt;br&amp;gt;&lt;br /&gt;
 make install&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
作成されたxdebug.soファイルを/usr/local/binディレクトリにコピーする。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo cp -a modules/xdebug.so /usr/local/bin&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 設定方法 ==&lt;br /&gt;
PHPのXdebug設定ファイルを開く。&amp;lt;br&amp;gt;&lt;br /&gt;
 sudo gedit /etc/php.d/15-xdebug.ini&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Xdebug設定ファイルを編集する。&amp;lt;br&amp;gt;&lt;br /&gt;
※OPCacheを使用する場合は、OPCacheの設定行の後にzend_extensionを入力すること。&amp;lt;br&amp;gt;&lt;br /&gt;
 1行目を編集&lt;br /&gt;
 zend_extension = /usr/local/bin/xdebug.so&lt;br /&gt;
&lt;br /&gt;
 最後尾の行に以下を追加&lt;br /&gt;
 xdebug.remote_log=&amp;quot;/tmp/xdebug.log&amp;quot;&lt;br /&gt;
 xdebug.profiler_enable = 1&lt;br /&gt;
 xdebug.remote_enable=on&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.remote_autostart=0&lt;br /&gt;
 xdebug.remote_connect_back=on&lt;br /&gt;
 xdebug.idekey=editor-xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 確認方法 ==&lt;br /&gt;
以下のコマンドを入力して、xdebugと表示されているならば成功である。&amp;lt;br&amp;gt;&lt;br /&gt;
 php -m | grep xdebug&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:CentOS]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=481</id>
		<title>ライブラリの基礎 - C++DLL</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=481"/>
		<updated>2019-12-05T05:37:49Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* サンプルコード */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
例えば、C++ DLLから次のような関数がエクスポートされているとする。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 void WINAPI ConvertToShort(char *pstr, short *pret);&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
上記の関数において、C# EXEから使用するときは、char*型は文字列なのでstring型を渡す。&amp;lt;br&amp;gt;&lt;br /&gt;
short*型はIntPtr型を渡す。(IntPtr型は汎用ポインタを表す型であり、void*型とほぼ同義)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
但し、C#は厳しい型付け言語なので、曖昧さを解決するために変換メソッドを経由する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
具体的には、IntPtr型の変数にMarshal.AllocHGlobal関数で必要なサイズのメモリを確保して、それをC++ DLLに渡した後、&amp;lt;br&amp;gt;&lt;br /&gt;
Marshal.ReadInt16関数(型によって異なる)等で変換した後、確保したメモリをMarshal.FreeHGlobal関数で解放するというプロセスを経る必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルコード ==&lt;br /&gt;
下記に、C++ DLLを呼ぶC# EXEのソースコードを記載する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 // DllImportを使用するために必要&lt;br /&gt;
 using System.Runtime.InteropServices;&lt;br /&gt;
 &lt;br /&gt;
 [DllImport(&amp;quot;DrsUtil.dll&amp;quot;, EntryPoint = &amp;quot;ConvertToShort&amp;quot;)]&lt;br /&gt;
 extern static void _ConvertToShort(string pstr, IntPtr pret); //呼び出し元の名前変えちゃう&lt;br /&gt;
 &lt;br /&gt;
 public static short ConvertToShort(string str)&lt;br /&gt;
 {&lt;br /&gt;
    IntPtr buffer = new IntPtr();&lt;br /&gt;
    buffer = Marshal.AllocHGlobal(2);		// 2バイトのメモリ確保&lt;br /&gt;
    _ConvertToShort(str, buffer);		// C++/DLLの関数を呼ぶ&lt;br /&gt;
    short sval = Marshal.ReadInt16(buffer);	// 変換&lt;br /&gt;
    Marshal.FreeHGlobal(buffer);		// メモリ開放&lt;br /&gt;
    return sval;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
IntPtr型の変数は様々なものが入るので、例えば、構造体を取得することも可能だが、C# EXEで構造体を定義しなければいけない。&amp;lt;br&amp;gt;&lt;br /&gt;
WindowsのDLL(Win32 API)と.NET Frameworkでは型の管理方法が違うため、実際には型の相互変換(マーシャリング)が行われる。&amp;lt;br&amp;gt;&lt;br /&gt;
尚、BOOL型の実体はLONG型と同じなので、boolの代わりにintを指定することも可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;表1. Win32 APIでの型名と対応するC#の型&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! APIの型名&amp;lt;br&amp;gt;(括弧内は対応するC言語の型) !! 対応するC#の型&amp;lt;br&amp;gt;(括弧内は.NET Frameworkでの型名) !! 備考&lt;br /&gt;
|-&lt;br /&gt;
| HANDLE (void *) || System.IntPtr&amp;lt;br&amp;gt;System.UIntPtr || x86は4バイト&amp;lt;br&amp;gt;x64は8バイト&lt;br /&gt;
|-&lt;br /&gt;
| BYTE (unsigned char) || byte (System.Byte) || &lt;br /&gt;
|-&lt;br /&gt;
| SHORT (short) || short (System.Int16) || &lt;br /&gt;
|-&lt;br /&gt;
| WORD (unsigned short) || ushort (System.UInt16) || &lt;br /&gt;
|-&lt;br /&gt;
| INT (int)&amp;lt;br&amp;gt;LONG (long) || int (System.Int32) || &lt;br /&gt;
|-&lt;br /&gt;
| UINT (unsigned int)&amp;lt;br&amp;gt;DWORD, ULONG (unsigned long) || uint (System.UInt32) || &lt;br /&gt;
|-&lt;br /&gt;
| BOOL (long) || bool (System.Boolean) || &lt;br /&gt;
|-&lt;br /&gt;
| CHAR (char) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| WCHAR(wchar_t) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPSTR (char *, char[])&amp;lt;br&amp;gt;LPWSTR (wchar_t *, wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPCSTR (const char *, const char[])&amp;lt;br&amp;gt;LPCWSTR (const wchar_t *, const wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| FLOAT (float) || float (System.Single) || &lt;br /&gt;
|-&lt;br /&gt;
| DOUBLE (double) || double (System.Double) || &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルコード ==&lt;br /&gt;
C++ DLLの作成方法は[[DLLを作成する(MFC)|コチラを参照]]する。&amp;lt;br&amp;gt;&lt;br /&gt;
下記にもC++ DLLを記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDLL.h&lt;br /&gt;
 &lt;br /&gt;
 double __stdcall SampleFunc01(int a);&lt;br /&gt;
 void   __stdcall SampleFunc02(int a, char *pstr)&lt;br /&gt;
 void   __stdcall SampleFunc03(int a, char *pstr)&lt;br /&gt;
 void   __stdcall SampleFunc04(SampleStruct st)&lt;br /&gt;
 void   __stdcall SampleFunc05(SampleStruct *pStructure)&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDll.cpp&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;SampleDll.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct tagSampleStruct&lt;br /&gt;
 {&lt;br /&gt;
    int index;&lt;br /&gt;
    char name[128];&lt;br /&gt;
    int data[50];&lt;br /&gt;
 } SampleStruct, *pSampleStruct;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct tagSampleStruct2&lt;br /&gt;
 {&lt;br /&gt;
    int length;&lt;br /&gt;
    double *data;&lt;br /&gt;
 } SampleStruct2, *pSampleStruct2;&lt;br /&gt;
 &lt;br /&gt;
 double __stdcall SampleFunc01(int a)&lt;br /&gt;
 {&lt;br /&gt;
    printf(--&amp;lt;SampleDll:SampleFunc01&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;a = %d\r\n&amp;quot;, a);&lt;br /&gt;
    printf(&amp;quot;---------------------------\r\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    return 3.14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc02(int a, char *pstr)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:SampleFunc02&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;[%d] %s\r\n&amp;quot;, a, str);&lt;br /&gt;
    printf(&amp;quot;-----------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc03(int a, char *pstr)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:SampleFunc03&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;[%d] %s\r\n&amp;quot;, a, str);&lt;br /&gt;
    sprintf_s(str, 256, &amp;quot;C++ DLL側から文字列を返す場合は、StringBuilderクラスを使用する&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc04(SampleStruct st)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:Sample04&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;index = %d\r\n&amp;quot;, st.index);&lt;br /&gt;
    printf(&amp;quot;name = %s\r\n&amp;quot;, st.name);&lt;br /&gt;
    printf(&amp;quot;data[0] = %d, data[1] = %d, data[2] = %d, data[3] = %d\r\n&amp;quot;, st.data[0], st.data[1], st.data[2], st.data[3]);&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc05(SampleStruct2 *pStructure)&lt;br /&gt;
 {&lt;br /&gt;
    dData[256] = {0};&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:Sample05&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    memset(pStructure, 0, sizeof(SampleStruct2));&lt;br /&gt;
    pStructure-&amp;gt;length = 10;&lt;br /&gt;
    pStructure-&amp;gt;data = dData;&lt;br /&gt;
    for(int i = 0; i &amp;lt; pStructure-&amp;gt;length; i++)&lt;br /&gt;
    {&lt;br /&gt;
       dData[i] = (i + 1) / 10.0;&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDll.def  // モジュール定義ファイル&lt;br /&gt;
 &lt;br /&gt;
 LIBRARY SampleDll&lt;br /&gt;
 &lt;br /&gt;
 EXPORTS&lt;br /&gt;
          ; 公開する関数名をリストアップ&lt;br /&gt;
          SampleFunc01   @1&lt;br /&gt;
          SampleFunc02   @2&lt;br /&gt;
          SampleFunc03   @3&lt;br /&gt;
          SampleFunc04   @4&lt;br /&gt;
          SampleFunc05   @5&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
次に、C# EXE側でC++ DLLを呼び出す方法を記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
文字列をC++ DLL側に渡す場合は、string型を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
文字列をC++ DLL側から返す場合は、string型ではなくStringBuilderクラスを使用する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
StringBuilderクラスは受け渡しの両方が可能なので、文字列はStringBuilderクラスを使用すべきである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
C++では構造体のサイズはコンパイル時に決定されるが、C#では実行時に決定される。&amp;lt;br&amp;gt;&lt;br /&gt;
したがって、C#側で構造体のサイズを予め指定する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
この場合、構造体は固定長サイズとなるため、配列などを定義する場合は異なるサイズの配列を後からインスタンス化することができなくなる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
構造体をC++ DLL側から返す場合、IntPtr型からdouble型の配列を取得するときは、一度Int64型に変換し、これをBitConverter.Int64BitsToDouble()メソッドでdouble型に変換する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 using System;&lt;br /&gt;
 using System.Text;&lt;br /&gt;
 using System.Runtime.InteropServices;&lt;br /&gt;
 &lt;br /&gt;
 namespace SampleEXE&lt;br /&gt;
 {&lt;br /&gt;
    class Program&lt;br /&gt;
    {&lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// 最も基本的な関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;a&amp;quot;&amp;gt;4 バイト符号付き整数を指定します。&amp;lt;/param&amp;gt;&lt;br /&gt;
       /// &amp;lt;returns&amp;gt;倍精度浮動小数を返します。&amp;lt;/returns&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern double SampleFunc01(int a);&lt;br /&gt;
 &lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;, CharSet = CharSet.Unicode)]&lt;br /&gt;
       // C++ DLL側の文字コードがUnicodeの場合は&amp;quot;CharSet = CharSet.Unicode&amp;quot;と明示的に指定する&lt;br /&gt;
       private static extern void SampleFunc02(int a, string str);&lt;br /&gt;
 &lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;, CharSet = CharSet.Unicode)]&lt;br /&gt;
       // C++ DLL側の文字コードがUnicodeの場合は&amp;quot;CharSet = CharSet.Unicode&amp;quot;と明示的に指定する&lt;br /&gt;
       private static extern void SampleFunc03(int a, StringBuilder str);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// 構造体を引数に持つ関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;st&amp;quot;&amp;gt;DLL 側に渡す構造体を指定します&amp;lt;/param&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern void SampleFunc04(SampleStruct st);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLL側からメンバにポインタを含む構造体を受け取る関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;pst&amp;quot;&amp;gt;受け渡す構造体の先頭アドレスを示すポインタを指定する&amp;lt;/param&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern void SampleFunc05(IntPtr pst);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLLとの取り合いのために定義する構造体&lt;br /&gt;
       /// LayoutKind.Sequentialを指定することで、C/C++同様、変数の宣言順通りにメモリに配置されるようになる&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;
       private struct SampleStruct&lt;br /&gt;
       {&lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 4バイト符号付整数&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.I4)]&lt;br /&gt;
          public int index;&lt;br /&gt;
 &lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 固定長文字配列(SizeConstは配列のサイズを示す)&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]&lt;br /&gt;
          public string name;&lt;br /&gt;
 &lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 固定長配列(SizeConstは配列の要素数を示す)&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]&lt;br /&gt;
          public int[] data;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLLとの取り合いのために定義する構造体&lt;br /&gt;
       /// LayoutKind.Sequentialを指定することで、C/C++同様、変数の宣言順通りにメモリに配置されるようにする&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;
       private struct SampleStruct2&lt;br /&gt;
       {&lt;br /&gt;
          public int length;&lt;br /&gt;
          public IntPtr data;&lt;br /&gt;
       }&lt;br /&gt;
　&lt;br /&gt;
       static void Main(string[] args)&lt;br /&gt;
       {&lt;br /&gt;
          var dRet= SampleFunc01(1);&lt;br /&gt;
          Console.WriteLine(dRet);&lt;br /&gt;
          Console.WriteLine();&lt;br /&gt;
 &lt;br /&gt;
          var str = &amp;quot;string型で文字列を渡すことができます。&amp;quot;;&lt;br /&gt;
          SampleFunc02(2, str);&lt;br /&gt;
 &lt;br /&gt;
          var strb = new System.Text.StringBuilder(256);&lt;br /&gt;
          strb.Append(&amp;quot;文字列のバッファを渡す場合は StringBuilder クラスで受け渡します。&amp;quot;);&lt;br /&gt;
          SampleFunc03(3, strb);&lt;br /&gt;
          Console.WriteLine(strb);&lt;br /&gt;
 &lt;br /&gt;
          var structHoge = new SampleStruct()&lt;br /&gt;
          {&lt;br /&gt;
             index = 4,&lt;br /&gt;
             name = &amp;quot;構造体サンプル&amp;quot;,&lt;br /&gt;
             data = new int[50],&lt;br /&gt;
          };&lt;br /&gt;
 &lt;br /&gt;
          structHoge.data[0] = 11;&lt;br /&gt;
          structHoge.data[1] = 22;&lt;br /&gt;
          structHoge.data[2] = 33;&lt;br /&gt;
          SampleFunc04(structHoge);&lt;br /&gt;
 &lt;br /&gt;
          // SampleStruct2構造体のサイズを取得する&lt;br /&gt;
          // 指定サイズ分だけメモリ領域を確保して、その先頭アドレスをstructPiyoに格納する&lt;br /&gt;
          var structPiyo = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SampleStruct2)));&lt;br /&gt;
          try&lt;br /&gt;
          {&lt;br /&gt;
             SampleFunc05(structPiyo);&lt;br /&gt;
             // 受け取ったstructPiyoからSampleStruct2構造体の情報に構築し直す&lt;br /&gt;
             var structFuga = (SampleStruct2)Marshal.PtrToStructure(structPiyo, typeof(SampleStruct2));&lt;br /&gt;
             for (int i = 0; i &amp;lt; structFuga.length; i++)&lt;br /&gt;
             {&lt;br /&gt;
                // IntPtr型からdouble型の数値を取得するときは、一度Int64型に変換して、これをBitConverter.Int64BitsToDoubleメソッドでdouble型に変換する&lt;br /&gt;
                var v = Marshal.ReadInt64(structFuga.data, i * sizeof(double));&lt;br /&gt;
                Console.WriteLine(&amp;quot;data[{0}] = {1}&amp;quot;, i, BitConverter.Int64BitsToDouble(v));&lt;br /&gt;
             }&lt;br /&gt;
          }&lt;br /&gt;
          catch (Exception ex)&lt;br /&gt;
          {&lt;br /&gt;
             System.Diagnostics.Debug.WriteLine(ex);&lt;br /&gt;
          }&lt;br /&gt;
          finally&lt;br /&gt;
          {&lt;br /&gt;
             // 必ずメモリを解放する&lt;br /&gt;
             Marshal.FreeHGlobal(sample06_a);&lt;br /&gt;
          }&lt;br /&gt;
 &lt;br /&gt;
          Console.ReadKey();&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DllImport属性には、DLLファイルのパスを指定する以外に次のような引数を与えることもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
これ他にも細かい設定をするための引数が用意されているので、DllImportAttributeクラスで検索すること。&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名称 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| CallingConvention || エントリポイントの呼び出し規約を明示的に指定できる。&amp;lt;br&amp;gt;指定なしの場合は__stdcallとなる。&lt;br /&gt;
|-&lt;br /&gt;
| CharSet || 文字列パラメータをメソッドにマーシャリングし、名前マングルを制御する方法を指定する。&amp;lt;br&amp;gt;文字コードの相互変換する時に指定する。&lt;br /&gt;
|-&lt;br /&gt;
| EntryPoint || 呼び出すDLLエントリポイントの名前または序数を指定する。&amp;lt;br&amp;gt;DLLの関数名とC#上で使用する関数名を異なる名前にする時に指定する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:C_Sharp]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=480</id>
		<title>ライブラリの基礎 - C++DLL</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=480"/>
		<updated>2019-12-05T05:31:38Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* サンプルコード */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
例えば、C++ DLLから次のような関数がエクスポートされているとする。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 void WINAPI ConvertToShort(char *pstr, short *pret);&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
上記の関数において、C# EXEから使用するときは、char*型は文字列なのでstring型を渡す。&amp;lt;br&amp;gt;&lt;br /&gt;
short*型はIntPtr型を渡す。(IntPtr型は汎用ポインタを表す型であり、void*型とほぼ同義)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
但し、C#は厳しい型付け言語なので、曖昧さを解決するために変換メソッドを経由する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
具体的には、IntPtr型の変数にMarshal.AllocHGlobal関数で必要なサイズのメモリを確保して、それをC++ DLLに渡した後、&amp;lt;br&amp;gt;&lt;br /&gt;
Marshal.ReadInt16関数(型によって異なる)等で変換した後、確保したメモリをMarshal.FreeHGlobal関数で解放するというプロセスを経る必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルコード ==&lt;br /&gt;
下記に、C++ DLLを呼ぶC# EXEのソースコードを記載する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 // DllImportを使用するために必要&lt;br /&gt;
 using System.Runtime.InteropServices;&lt;br /&gt;
 &lt;br /&gt;
 [DllImport(&amp;quot;DrsUtil.dll&amp;quot;, EntryPoint = &amp;quot;ConvertToShort&amp;quot;)]&lt;br /&gt;
 extern static void _ConvertToShort(string pstr, IntPtr pret); //呼び出し元の名前変えちゃう&lt;br /&gt;
 &lt;br /&gt;
 public static short ConvertToShort(string str)&lt;br /&gt;
 {&lt;br /&gt;
    IntPtr buffer = new IntPtr();&lt;br /&gt;
    buffer = Marshal.AllocHGlobal(2);		// 2バイトのメモリ確保&lt;br /&gt;
    _ConvertToShort(str, buffer);		// C++/DLLの関数を呼ぶ&lt;br /&gt;
    short sval = Marshal.ReadInt16(buffer);	// 変換&lt;br /&gt;
    Marshal.FreeHGlobal(buffer);		// メモリ開放&lt;br /&gt;
    return sval;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
IntPtr型の変数は様々なものが入るので、例えば、構造体を取得することも可能だが、C# EXEで構造体を定義しなければいけない。&amp;lt;br&amp;gt;&lt;br /&gt;
WindowsのDLL(Win32 API)と.NET Frameworkでは型の管理方法が違うため、実際には型の相互変換(マーシャリング)が行われる。&amp;lt;br&amp;gt;&lt;br /&gt;
尚、BOOL型の実体はLONG型と同じなので、boolの代わりにintを指定することも可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;表1. Win32 APIでの型名と対応するC#の型&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! APIの型名&amp;lt;br&amp;gt;(括弧内は対応するC言語の型) !! 対応するC#の型&amp;lt;br&amp;gt;(括弧内は.NET Frameworkでの型名) !! 備考&lt;br /&gt;
|-&lt;br /&gt;
| HANDLE (void *) || System.IntPtr&amp;lt;br&amp;gt;System.UIntPtr || x86は4バイト&amp;lt;br&amp;gt;x64は8バイト&lt;br /&gt;
|-&lt;br /&gt;
| BYTE (unsigned char) || byte (System.Byte) || &lt;br /&gt;
|-&lt;br /&gt;
| SHORT (short) || short (System.Int16) || &lt;br /&gt;
|-&lt;br /&gt;
| WORD (unsigned short) || ushort (System.UInt16) || &lt;br /&gt;
|-&lt;br /&gt;
| INT (int)&amp;lt;br&amp;gt;LONG (long) || int (System.Int32) || &lt;br /&gt;
|-&lt;br /&gt;
| UINT (unsigned int)&amp;lt;br&amp;gt;DWORD, ULONG (unsigned long) || uint (System.UInt32) || &lt;br /&gt;
|-&lt;br /&gt;
| BOOL (long) || bool (System.Boolean) || &lt;br /&gt;
|-&lt;br /&gt;
| CHAR (char) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| WCHAR(wchar_t) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPSTR (char *, char[])&amp;lt;br&amp;gt;LPWSTR (wchar_t *, wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPCSTR (const char *, const char[])&amp;lt;br&amp;gt;LPCWSTR (const wchar_t *, const wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| FLOAT (float) || float (System.Single) || &lt;br /&gt;
|-&lt;br /&gt;
| DOUBLE (double) || double (System.Double) || &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルコード ==&lt;br /&gt;
C++ DLLの作成方法は[[DLLを作成する(MFC)|コチラを参照]]する。&amp;lt;br&amp;gt;&lt;br /&gt;
下記にもC++ DLLを記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDLL.h&lt;br /&gt;
 &lt;br /&gt;
 double __stdcall SampleFunc01(int a);&lt;br /&gt;
 void   __stdcall SampleFunc02(int a, char *pstr)&lt;br /&gt;
 void   __stdcall SampleFunc03(int a, char *pstr)&lt;br /&gt;
 void   __stdcall SampleFunc04(SampleStruct st)&lt;br /&gt;
 void   __stdcall SampleFunc05(SampleStruct *pStructure)&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDll.cpp&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;SampleDll.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct tagSampleStruct&lt;br /&gt;
 {&lt;br /&gt;
    int index;&lt;br /&gt;
    char name[128];&lt;br /&gt;
    int data[50];&lt;br /&gt;
 } SampleStruct, *pSampleStruct;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct tagSampleStruct2&lt;br /&gt;
 {&lt;br /&gt;
    int length;&lt;br /&gt;
    double *data;&lt;br /&gt;
 } SampleStruct2, *pSampleStruct2;&lt;br /&gt;
 &lt;br /&gt;
 double __stdcall SampleFunc01(int a)&lt;br /&gt;
 {&lt;br /&gt;
    printf(--&amp;lt;SampleDll:SampleFunc01&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;a = %d\r\n&amp;quot;, a);&lt;br /&gt;
    printf(&amp;quot;---------------------------\r\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    return 3.14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc02(int a, char *pstr)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:SampleFunc02&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;[%d] %s\r\n&amp;quot;, a, str);&lt;br /&gt;
    printf(&amp;quot;-----------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc03(int a, char *pstr)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:SampleFunc03&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;[%d] %s\r\n&amp;quot;, a, str);&lt;br /&gt;
    sprintf_s(str, 256, &amp;quot;C++ DLL側から文字列を返す場合は、StringBuilderクラスを使用する&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc04(SampleStruct st)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:Sample04&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;index = %d\r\n&amp;quot;, st.index);&lt;br /&gt;
    printf(&amp;quot;name = %s\r\n&amp;quot;, st.name);&lt;br /&gt;
    printf(&amp;quot;data[0] = %d, data[1] = %d, data[2] = %d, data[3] = %d\r\n&amp;quot;, st.data[0], st.data[1], st.data[2], st.data[3]);&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc05(SampleStruct2 *pStructure)&lt;br /&gt;
 {&lt;br /&gt;
    dData[256] = {0};&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:Sample05&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    memset(pStructure, 0, sizeof(SampleStruct2));&lt;br /&gt;
    pStructure-&amp;gt;length = 10;&lt;br /&gt;
    pStructure-&amp;gt;data = dData;&lt;br /&gt;
    for(int i = 0; i &amp;lt; pStructure-&amp;gt;length; i++)&lt;br /&gt;
    {&lt;br /&gt;
       dData[i] = (i + 1) / 10.0;&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDll.def  // モジュール定義ファイル&lt;br /&gt;
 &lt;br /&gt;
 LIBRARY SampleDll&lt;br /&gt;
 &lt;br /&gt;
 EXPORTS&lt;br /&gt;
          ; 公開する関数名をリストアップ&lt;br /&gt;
          SampleFunc01   @1&lt;br /&gt;
          SampleFunc02   @2&lt;br /&gt;
          SampleFunc03   @3&lt;br /&gt;
          SampleFunc04   @4&lt;br /&gt;
          SampleFunc05   @5&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
次に、C# EXE側でC++ DLLを呼び出す方法を記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
文字列をC++ DLL側に渡す場合は、string型を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
文字列をC++ DLL側から返す場合は、string型ではなくStringBuilderクラスを使用する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
StringBuilderクラスは受け渡しの両方が可能なので、文字列はStringBuilderクラスを使用すべきである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
C++では構造体のサイズはコンパイル時に決定されるが、C#では実行時に決定される。&amp;lt;br&amp;gt;&lt;br /&gt;
したがって、C#側で構造体のサイズを予め指定する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
この場合、構造体は固定長サイズとなるため、配列などを定義する場合は異なるサイズの配列を後からインスタンス化することができなくなる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
構造体をC++ DLL側から返す場合、IntPtr型からdouble型の配列を取得するときは、一度Int64型に変換し、これをBitConverter.Int64BitsToDouble()メソッドでdouble型に変換する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 using System;&lt;br /&gt;
 using System.Text;&lt;br /&gt;
 using System.Runtime.InteropServices;&lt;br /&gt;
 &lt;br /&gt;
 namespace SampleEXE&lt;br /&gt;
 {&lt;br /&gt;
    class Program&lt;br /&gt;
    {&lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// 最も基本的な関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;a&amp;quot;&amp;gt;4 バイト符号付き整数を指定します。&amp;lt;/param&amp;gt;&lt;br /&gt;
       /// &amp;lt;returns&amp;gt;倍精度浮動小数を返します。&amp;lt;/returns&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern double SampleFunc01(int a);&lt;br /&gt;
 &lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;, CharSet = CharSet.Unicode)]&lt;br /&gt;
       // C++ DLL側の文字コードがUnicodeの場合は&amp;quot;CharSet = CharSet.Unicode&amp;quot;と明示的に指定する&lt;br /&gt;
       private static extern void SampleFunc02(int a, string str);&lt;br /&gt;
 &lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;, CharSet = CharSet.Unicode)]&lt;br /&gt;
       // C++ DLL側の文字コードがUnicodeの場合は&amp;quot;CharSet = CharSet.Unicode&amp;quot;と明示的に指定する&lt;br /&gt;
       private static extern void SampleFunc03(int a, StringBuilder str);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// 構造体を引数に持つ関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;st&amp;quot;&amp;gt;DLL 側に渡す構造体を指定します&amp;lt;/param&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern void SampleFunc04(SampleStruct st);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLL側からメンバにポインタを含む構造体を受け取る関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;pst&amp;quot;&amp;gt;受け渡す構造体の先頭アドレスを示すポインタを指定する&amp;lt;/param&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern void SampleFunc05(IntPtr pst);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLLとの取り合いのために定義する構造体&lt;br /&gt;
       /// LayoutKind.Sequentialを指定することで、C/C++同様、変数の宣言順通りにメモリに配置されるようになる&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;
       private struct SampleStruct&lt;br /&gt;
       {&lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 4バイト符号付整数&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.I4)]&lt;br /&gt;
          public int index;&lt;br /&gt;
 &lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 固定長文字配列(SizeConstは配列のサイズを示す)&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]&lt;br /&gt;
          public string name;&lt;br /&gt;
 &lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 固定長配列(SizeConstは配列の要素数を示す)&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]&lt;br /&gt;
          public int[] data;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLLとの取り合いのために定義する構造体&lt;br /&gt;
       /// LayoutKind.Sequentialを指定することで、C/C++同様、変数の宣言順通りにメモリに配置されるようにする&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;
       private struct SampleStruct2&lt;br /&gt;
       {&lt;br /&gt;
          public int length;&lt;br /&gt;
          public IntPtr data;&lt;br /&gt;
       }&lt;br /&gt;
　&lt;br /&gt;
       static void Main(string[] args)&lt;br /&gt;
       {&lt;br /&gt;
          var dRet= SampleFunc01(1);&lt;br /&gt;
          Console.WriteLine(dRet);&lt;br /&gt;
          Console.WriteLine();&lt;br /&gt;
 &lt;br /&gt;
          var str = &amp;quot;string型で文字列を渡すことができます。&amp;quot;;&lt;br /&gt;
          SampleFunc02(2, str);&lt;br /&gt;
 &lt;br /&gt;
          var strb = new System.Text.StringBuilder(256);&lt;br /&gt;
          strb.Append(&amp;quot;文字列のバッファを渡す場合は StringBuilder クラスで受け渡します。&amp;quot;);&lt;br /&gt;
          SampleFunc03(3, strb);&lt;br /&gt;
          Console.WriteLine(strb);&lt;br /&gt;
 &lt;br /&gt;
          var structHoge = new SampleStruct()&lt;br /&gt;
          {&lt;br /&gt;
             index = 4,&lt;br /&gt;
             name = &amp;quot;構造体サンプル&amp;quot;,&lt;br /&gt;
             data = new int[50],&lt;br /&gt;
          };&lt;br /&gt;
 &lt;br /&gt;
          structHoge.data[0] = 11;&lt;br /&gt;
          structHoge.data[1] = 22;&lt;br /&gt;
          structHoge.data[2] = 33;&lt;br /&gt;
          SampleFunc04(structHoge);&lt;br /&gt;
 &lt;br /&gt;
          // SampleStruct2構造体のサイズを取得する&lt;br /&gt;
          // 指定サイズ分だけメモリ領域を確保して、その先頭アドレスをstructPiyoに格納する&lt;br /&gt;
          var structPiyo = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SampleStruct2)));&lt;br /&gt;
          try&lt;br /&gt;
          {&lt;br /&gt;
             SampleFunc05(structPiyo);&lt;br /&gt;
             // 受け取ったstructPiyoからSampleStruct2構造体の情報に構築し直す&lt;br /&gt;
             var structFuga = (SampleStruct2)Marshal.PtrToStructure(structPiyo, typeof(SampleStruct2));&lt;br /&gt;
             for (int i = 0; i &amp;lt; structFuga.length; i++)&lt;br /&gt;
             {&lt;br /&gt;
                var v = Marshal.ReadInt64(structFuga.data, i * sizeof(double));&lt;br /&gt;
                Console.WriteLine(&amp;quot;data[{0}] = {1}&amp;quot;, i, BitConverter.Int64BitsToDouble(v));&lt;br /&gt;
             }&lt;br /&gt;
          }&lt;br /&gt;
          catch (Exception ex)&lt;br /&gt;
          {&lt;br /&gt;
             System.Diagnostics.Debug.WriteLine(ex);&lt;br /&gt;
          }&lt;br /&gt;
          finally&lt;br /&gt;
          {&lt;br /&gt;
             // 必ずメモリを解放する&lt;br /&gt;
             Marshal.FreeHGlobal(sample06_a);&lt;br /&gt;
          }&lt;br /&gt;
 &lt;br /&gt;
          Console.ReadKey();&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DllImport属性には、DLLファイルのパスを指定する以外に次のような引数を与えることもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
これ他にも細かい設定をするための引数が用意されているので、DllImportAttributeクラスで検索すること。&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名称 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| CallingConvention || エントリポイントの呼び出し規約を明示的に指定できる。&amp;lt;br&amp;gt;指定なしの場合は__stdcallとなる。&lt;br /&gt;
|-&lt;br /&gt;
| CharSet || 文字列パラメータをメソッドにマーシャリングし、名前マングルを制御する方法を指定する。&amp;lt;br&amp;gt;文字コードの相互変換する時に指定する。&lt;br /&gt;
|-&lt;br /&gt;
| EntryPoint || 呼び出すDLLエントリポイントの名前または序数を指定する。&amp;lt;br&amp;gt;DLLの関数名とC#上で使用する関数名を異なる名前にする時に指定する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:C_Sharp]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=470</id>
		<title>ライブラリの基礎 - C++DLL</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=470"/>
		<updated>2019-11-21T18:00:21Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* サンプルコード */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
例えば、C++ DLLから次のような関数がエクスポートされているとする。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 void WINAPI ConvertToShort(char *pstr, short *pret);&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
上記の関数において、C# EXEから使用するときは、char*型は文字列なのでstring型を渡す。&amp;lt;br&amp;gt;&lt;br /&gt;
short*型はIntPtr型を渡す。(IntPtr型は汎用ポインタを表す型であり、void*型とほぼ同義)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
但し、C#は厳しい型付け言語なので、曖昧さを解決するために変換メソッドを経由する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
具体的には、IntPtr型の変数にMarshal.AllocHGlobal関数で必要なサイズのメモリを確保して、それをC++ DLLに渡した後、&amp;lt;br&amp;gt;&lt;br /&gt;
Marshal.ReadInt16関数(型によって異なる)等で変換した後、確保したメモリをMarshal.FreeHGlobal関数で解放するというプロセスを経る必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルコード ==&lt;br /&gt;
下記に、C++ DLLを呼ぶC# EXEのソースコードを記載する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 // DllImportを使用するために必要&lt;br /&gt;
 using System.Runtime.InteropServices;&lt;br /&gt;
 &lt;br /&gt;
 [DllImport(&amp;quot;DrsUtil.dll&amp;quot;, EntryPoint = &amp;quot;ConvertToShort&amp;quot;)]&lt;br /&gt;
 extern static void _ConvertToShort(string pstr, IntPtr pret); //呼び出し元の名前変えちゃう&lt;br /&gt;
 &lt;br /&gt;
 public static short ConvertToShort(string str)&lt;br /&gt;
 {&lt;br /&gt;
    IntPtr buffer = new IntPtr();&lt;br /&gt;
    buffer = Marshal.AllocHGlobal(2);		// 2バイトのメモリ確保&lt;br /&gt;
    _ConvertToShort(str, buffer);		// C++/DLLの関数を呼ぶ&lt;br /&gt;
    short sval = Marshal.ReadInt16(buffer);	// 変換&lt;br /&gt;
    Marshal.FreeHGlobal(buffer);		// メモリ開放&lt;br /&gt;
    return sval;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
IntPtr型の変数は様々なものが入るので、例えば、構造体を取得することも可能だが、C# EXEで構造体を定義しなければいけない。&amp;lt;br&amp;gt;&lt;br /&gt;
WindowsのDLL(Win32 API)と.NET Frameworkでは型の管理方法が違うため、実際には型の相互変換(マーシャリング)が行われる。&amp;lt;br&amp;gt;&lt;br /&gt;
尚、BOOL型の実体はLONG型と同じなので、boolの代わりにintを指定することも可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;表1. Win32 APIでの型名と対応するC#の型&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! APIの型名&amp;lt;br&amp;gt;(括弧内は対応するC言語の型) !! 対応するC#の型&amp;lt;br&amp;gt;(括弧内は.NET Frameworkでの型名) !! 備考&lt;br /&gt;
|-&lt;br /&gt;
| HANDLE (void *) || System.IntPtr&amp;lt;br&amp;gt;System.UIntPtr || x86は4バイト&amp;lt;br&amp;gt;x64は8バイト&lt;br /&gt;
|-&lt;br /&gt;
| BYTE (unsigned char) || byte (System.Byte) || &lt;br /&gt;
|-&lt;br /&gt;
| SHORT (short) || short (System.Int16) || &lt;br /&gt;
|-&lt;br /&gt;
| WORD (unsigned short) || ushort (System.UInt16) || &lt;br /&gt;
|-&lt;br /&gt;
| INT (int)&amp;lt;br&amp;gt;LONG (long) || int (System.Int32) || &lt;br /&gt;
|-&lt;br /&gt;
| UINT (unsigned int)&amp;lt;br&amp;gt;DWORD, ULONG (unsigned long) || uint (System.UInt32) || &lt;br /&gt;
|-&lt;br /&gt;
| BOOL (long) || bool (System.Boolean) || &lt;br /&gt;
|-&lt;br /&gt;
| CHAR (char) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| WCHAR(wchar_t) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPSTR (char *, char[])&amp;lt;br&amp;gt;LPWSTR (wchar_t *, wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPCSTR (const char *, const char[])&amp;lt;br&amp;gt;LPCWSTR (const wchar_t *, const wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| FLOAT (float) || float (System.Single) || &lt;br /&gt;
|-&lt;br /&gt;
| DOUBLE (double) || double (System.Double) || &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルコード ==&lt;br /&gt;
C++ DLLの作成方法は[[DLLを作成する(MFC)|コチラを参照]]する。&amp;lt;br&amp;gt;&lt;br /&gt;
下記にもC++ DLLを記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDLL.h&lt;br /&gt;
 &lt;br /&gt;
 double __stdcall SampleFunc01(int a);&lt;br /&gt;
 void   __stdcall SampleFunc02(int a, char *pstr)&lt;br /&gt;
 void   __stdcall SampleFunc03(int a, char *pstr)&lt;br /&gt;
 void   __stdcall SampleFunc04(SampleStruct st)&lt;br /&gt;
 void   __stdcall SampleFunc05(SampleStruct *pStructure)&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDll.cpp&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;SampleDll.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct tagSampleStruct&lt;br /&gt;
 {&lt;br /&gt;
    int index;&lt;br /&gt;
    char name[128];&lt;br /&gt;
    int data[50];&lt;br /&gt;
 } SampleStruct, *pSampleStruct;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct tagSampleStruct2&lt;br /&gt;
 {&lt;br /&gt;
    int length;&lt;br /&gt;
    double *data;&lt;br /&gt;
 } SampleStruct2, *pSampleStruct2;&lt;br /&gt;
 &lt;br /&gt;
 double __stdcall SampleFunc01(int a)&lt;br /&gt;
 {&lt;br /&gt;
    printf(--&amp;lt;SampleDll:SampleFunc01&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;a = %d\r\n&amp;quot;, a);&lt;br /&gt;
    printf(&amp;quot;---------------------------\r\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    return 3.14;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc02(int a, char *pstr)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:SampleFunc02&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;[%d] %s\r\n&amp;quot;, a, str);&lt;br /&gt;
    printf(&amp;quot;-----------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc03(int a, char *pstr)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:SampleFunc03&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;[%d] %s\r\n&amp;quot;, a, str);&lt;br /&gt;
    sprintf_s(str, 256, &amp;quot;C++ DLL側から文字列を返す場合は、StringBuilderクラスを使用する&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc04(SampleStruct st)&lt;br /&gt;
 {&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:Sample04&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    printf(&amp;quot;index = %d\r\n&amp;quot;, st.index);&lt;br /&gt;
    printf(&amp;quot;name = %s\r\n&amp;quot;, st.name);&lt;br /&gt;
    printf(&amp;quot;data[0] = %d, data[1] = %d, data[2] = %d, data[3] = %d\r\n&amp;quot;, st.data[0], st.data[1], st.data[2], st.data[3]);&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void __stdcall SampleFunc05(SampleStruct2 *pStructure)&lt;br /&gt;
 {&lt;br /&gt;
    dData[256] = {0};&lt;br /&gt;
    printf(&amp;quot;--&amp;lt;SampleDll:Sample05&amp;gt;--\r\n&amp;quot;);&lt;br /&gt;
    memset(pStructure, 0, sizeof(SampleStruct2));&lt;br /&gt;
    pStructure-&amp;gt;length = 10;&lt;br /&gt;
    pStructure-&amp;gt;data = dData;&lt;br /&gt;
    for(int i = 0; i &amp;lt; pStructure-&amp;gt;length; i++)&lt;br /&gt;
    {&lt;br /&gt;
       dData[i] = (i + 1) / 10.0;&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;------------------------\r\n&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 SampleDll.def  // モジュール定義ファイル&lt;br /&gt;
 &lt;br /&gt;
 LIBRARY SampleDll&lt;br /&gt;
 &lt;br /&gt;
 EXPORTS&lt;br /&gt;
          ; 公開する関数名をリストアップ&lt;br /&gt;
          SampleFunc01   @1&lt;br /&gt;
          SampleFunc02   @2&lt;br /&gt;
          SampleFunc03   @3&lt;br /&gt;
          SampleFunc04   @4&lt;br /&gt;
          SampleFunc05   @5&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
次に、C# EXE側でC++ DLLを呼び出す方法を記述する。&amp;lt;br&amp;gt;&lt;br /&gt;
文字列をC++ DLL側に渡す場合は、string型を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
文字列をC++ DLL側から返す場合は、string型ではなくStringBuilderクラスを使用する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
StringBuilderクラスは受け渡しの両方が可能なので、文字列はStringBuilderクラスを使用すべきである。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
C++では構造体のサイズはコンパイル時に決定されるが、C#では実行時に決定される。&amp;lt;br&amp;gt;&lt;br /&gt;
したがって、C#側で構造体のサイズを予め指定する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
この場合、構造体は固定長サイズとなるため、配列などを定義する場合は異なるサイズの配列を後からインスタンス化することができなくなる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
構造体をC++ DLL側から返す場合、IntPtr型からdouble型の配列を取得するときは、一度Int64型に変換し、これをBitConverter.Int64BitsToDouble()メソッドでdouble型に変換する。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 using System;&lt;br /&gt;
 using System.Text;&lt;br /&gt;
 using System.Runtime.InteropServices;&lt;br /&gt;
 &lt;br /&gt;
 namespace SampleEXE&lt;br /&gt;
 {&lt;br /&gt;
    class Program&lt;br /&gt;
    {&lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// 最も基本的な関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;a&amp;quot;&amp;gt;4 バイト符号付き整数を指定します。&amp;lt;/param&amp;gt;&lt;br /&gt;
       /// &amp;lt;returns&amp;gt;倍精度浮動小数を返します。&amp;lt;/returns&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern double SampleFunc01(int a);&lt;br /&gt;
 &lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;, CharSet = CharSet.Unicode)]&lt;br /&gt;
       // C++ DLL側の文字コードがUnicodeの場合は&amp;quot;CharSet = CharSet.Unicode&amp;quot;と明示的に指定する&lt;br /&gt;
       private static extern void SampleFunc02(int a, string str);&lt;br /&gt;
 &lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;, CharSet = CharSet.Unicode)]&lt;br /&gt;
       // C++ DLL側の文字コードがUnicodeの場合は&amp;quot;CharSet = CharSet.Unicode&amp;quot;と明示的に指定する&lt;br /&gt;
       private static extern void SampleFunc03(int a, StringBuilder str);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// 構造体を引数に持つ関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;st&amp;quot;&amp;gt;DLL 側に渡す構造体を指定します&amp;lt;/param&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern void SampleFunc04(SampleStruct st);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLL側からメンバにポインタを含む構造体を受け取る関数のインポート例&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       /// &amp;lt;param name=&amp;quot;pst&amp;quot;&amp;gt;受け渡す構造体の先頭アドレスを示すポインタを指定する&amp;lt;/param&amp;gt;&lt;br /&gt;
       [DllImport(&amp;quot;SampleDLL.dll&amp;quot;)]&lt;br /&gt;
       private static extern void SampleFunc05(IntPtr pst);&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLLとの取り合いのために定義する構造体&lt;br /&gt;
       /// LayoutKind.Sequentialを指定することで、C/C++同様、変数の宣言順通りにメモリに配置されるようになる&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;
       private struct SampleStruct&lt;br /&gt;
       {&lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 4バイト符号付整数&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.I4)]&lt;br /&gt;
          public int index;&lt;br /&gt;
 &lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 固定長文字配列(SizeConstは配列のサイズを示す)&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]&lt;br /&gt;
          public string name;&lt;br /&gt;
 &lt;br /&gt;
          /// &amp;lt;summary&amp;gt;&lt;br /&gt;
          /// 固定長配列(SizeConstは配列の要素数を示す)&lt;br /&gt;
          /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]&lt;br /&gt;
          public int[] data;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
       /// &amp;lt;summary&amp;gt;&lt;br /&gt;
       /// DLLとの取り合いのために定義する構造体&lt;br /&gt;
       /// LayoutKind.Sequentialを指定することで、C/C++同様、変数の宣言順通りにメモリに配置されるようにする&lt;br /&gt;
       /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
       [StructLayout(LayoutKind.Sequential)]&lt;br /&gt;
       private struct SampleStruct2&lt;br /&gt;
       {&lt;br /&gt;
          public int length;&lt;br /&gt;
          public IntPtr data;&lt;br /&gt;
       }&lt;br /&gt;
　&lt;br /&gt;
       static void Main(string[] args)&lt;br /&gt;
       {&lt;br /&gt;
          var dRet= SampleFunc01(1);&lt;br /&gt;
          Console.WriteLine(dRet);&lt;br /&gt;
          Console.WriteLine();&lt;br /&gt;
 &lt;br /&gt;
          var str = &amp;quot;string型で文字列を渡すことができます。&amp;quot;;&lt;br /&gt;
          SampleFunc02(2, str);&lt;br /&gt;
 &lt;br /&gt;
          var strb = new System.Text.StringBuilder(256);&lt;br /&gt;
          strb.Append(&amp;quot;文字列のバッファを渡す場合は StringBuilder クラスで受け渡します。&amp;quot;);&lt;br /&gt;
          SampleFunc03(3, strb);&lt;br /&gt;
          Console.WriteLine(strb);&lt;br /&gt;
 &lt;br /&gt;
          var structHoge = new SampleStruct()&lt;br /&gt;
          {&lt;br /&gt;
             index = 4,&lt;br /&gt;
             name = &amp;quot;構造体サンプル&amp;quot;,&lt;br /&gt;
             data = new int[50],&lt;br /&gt;
          };&lt;br /&gt;
 &lt;br /&gt;
          structHoge.data[0] = 11;&lt;br /&gt;
          structHoge.data[1] = 22;&lt;br /&gt;
          structHoge.data[2] = 33;&lt;br /&gt;
          SampleFunc04(structHoge);&lt;br /&gt;
 &lt;br /&gt;
          var structPiyo = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SampleStruct2)));&lt;br /&gt;
          try&lt;br /&gt;
          {&lt;br /&gt;
             SampleFunc05(structPiyo);&lt;br /&gt;
             var structFuga = (SampleStruct2)Marshal.PtrToStructure(structPiyo, typeof(SampleStruct2));&lt;br /&gt;
             for (int i = 0; i &amp;lt; structFuga.length; i++)&lt;br /&gt;
             {&lt;br /&gt;
                var v = Marshal.ReadInt64(structFuga.data, i * sizeof(double));&lt;br /&gt;
                Console.WriteLine(&amp;quot;data[{0}] = {1}&amp;quot;, i, BitConverter.Int64BitsToDouble(v));&lt;br /&gt;
             }&lt;br /&gt;
          }&lt;br /&gt;
          catch (Exception ex)&lt;br /&gt;
          {&lt;br /&gt;
             System.Diagnostics.Debug.WriteLine(ex);&lt;br /&gt;
          }&lt;br /&gt;
          finally&lt;br /&gt;
          {&lt;br /&gt;
             // 必ずメモリを解放する&lt;br /&gt;
             Marshal.FreeHGlobal(sample06_a);&lt;br /&gt;
          }&lt;br /&gt;
 &lt;br /&gt;
          Console.ReadKey();&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DllImport属性には、DLLファイルのパスを指定する以外に次のような引数を与えることもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
これ他にも細かい設定をするための引数が用意されているので、DllImportAttributeクラスで検索すること。&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名称 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| CallingConvention || エントリポイントの呼び出し規約を明示的に指定できる。&amp;lt;br&amp;gt;指定なしの場合は__stdcallとなる。&lt;br /&gt;
|-&lt;br /&gt;
| CharSet || 文字列パラメータをメソッドにマーシャリングし、名前マングルを制御する方法を指定する。&amp;lt;br&amp;gt;文字コードの相互変換する時に指定する。&lt;br /&gt;
|-&lt;br /&gt;
| EntryPoint || 呼び出すDLLエントリポイントの名前または序数を指定する。&amp;lt;br&amp;gt;DLLの関数名とC#上で使用する関数名を異なる名前にする時に指定する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:C_Sharp]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=461</id>
		<title>ライブラリの基礎 - C++DLL</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%9F%BA%E7%A4%8E_-_C%2B%2BDLL&amp;diff=461"/>
		<updated>2019-10-31T04:14:14Z</updated>

		<summary type="html">&lt;p&gt;192.168.1.17: /* サンプルコード */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
C# EXEからC++ DLLへ様々なデータ型の変数を渡したいときがある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
例えば、C++ DLLから次のような関数がエクスポートされているとする。&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 void WINAPI ConvertToShort(char *pstr, short *pret);&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
上記の関数において、C# EXEから使用するときは、char*型は文字列なのでstring型を渡す。&amp;lt;br&amp;gt;&lt;br /&gt;
short*型はIntPtr型を渡す。(IntPtr型は汎用ポインタを表す型であり、void*型とほぼ同義)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
但し、C#は厳しい型付け言語なので、曖昧さを解決するために変換メソッドを経由する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
具体的には、IntPtr型の変数にMarshal.AllocHGlobal関数で必要なサイズのメモリを確保して、それをC++ DLLに渡した後、&amp;lt;br&amp;gt;&lt;br /&gt;
Marshal.ReadInt16関数(型によって異なる)等で変換した後、確保したメモリをMarshal.FreeHGlobal関数で解放するというプロセスを経る必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルコード ==&lt;br /&gt;
下記に、C++ DLLを呼ぶC# EXEのソースコードを記載する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
 // DllImportを使用するために必要&lt;br /&gt;
 using System.Runtime.InteropServices;&lt;br /&gt;
 &lt;br /&gt;
 [DllImport(&amp;quot;DrsUtil.dll&amp;quot;, EntryPoint = &amp;quot;ConvertToShort&amp;quot;)]&lt;br /&gt;
 extern static void _ConvertToShort(string pstr, IntPtr pret); //呼び出し元の名前変えちゃう&lt;br /&gt;
 &lt;br /&gt;
 public static short ConvertToShort(string str)&lt;br /&gt;
 {&lt;br /&gt;
    IntPtr buffer = new IntPtr();&lt;br /&gt;
    buffer = Marshal.AllocHGlobal(2);		// 2バイトのメモリ確保&lt;br /&gt;
    _ConvertToShort(str, buffer);		// C++/DLLの関数を呼ぶ&lt;br /&gt;
    short sval = Marshal.ReadInt16(buffer);	// 変換&lt;br /&gt;
    Marshal.FreeHGlobal(buffer);		// メモリ開放&lt;br /&gt;
    return sval;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
IntPtr型の変数は様々なものが入るので、例えば、構造体を取得することも可能だが、C# EXEで構造体を定義しなければいけない。&amp;lt;br&amp;gt;&lt;br /&gt;
WindowsのDLL(Win32 API)と.NET Frameworkでは型の管理方法が違うため、実際には型の相互変換(マーシャリング)が行われる。&amp;lt;br&amp;gt;&lt;br /&gt;
尚、BOOL型の実体はLONG型と同じなので、boolの代わりにintを指定することも可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;表1. Win32 APIでの型名と対応するC#の型&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! APIの型名&amp;lt;br&amp;gt;(括弧内は対応するC言語の型) !! 対応するC#の型&amp;lt;br&amp;gt;(括弧内は.NET Frameworkでの型名) !! 備考&lt;br /&gt;
|-&lt;br /&gt;
| HANDLE (void *) || System.IntPtr&amp;lt;br&amp;gt;System.UIntPtr || x86は4バイト&amp;lt;br&amp;gt;x64は8バイト&lt;br /&gt;
|-&lt;br /&gt;
| BYTE (unsigned char) || byte (System.Byte) || &lt;br /&gt;
|-&lt;br /&gt;
| SHORT (short) || short (System.Int16) || &lt;br /&gt;
|-&lt;br /&gt;
| WORD (unsigned short) || ushort (System.UInt16) || &lt;br /&gt;
|-&lt;br /&gt;
| INT (int)&amp;lt;br&amp;gt;LONG (long) || int (System.Int32) || &lt;br /&gt;
|-&lt;br /&gt;
| UINT (unsigned int)&amp;lt;br&amp;gt;DWORD, ULONG (unsigned long) || uint (System.UInt32) || &lt;br /&gt;
|-&lt;br /&gt;
| BOOL (long) || bool (System.Boolean) || &lt;br /&gt;
|-&lt;br /&gt;
| CHAR (char) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| WCHAR(wchar_t) || 文字を渡すとき&amp;lt;br&amp;gt;char (System.Char)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPSTR (char *, char[])&amp;lt;br&amp;gt;LPWSTR (wchar_t *, wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| LPCSTR (const char *, const char[])&amp;lt;br&amp;gt;LPCWSTR (const wchar_t *, const wchar_t[]) || 文字を渡すとき&amp;lt;br&amp;gt;string (System.String)&amp;lt;br&amp;gt;文字を受け取るとき&amp;lt;br&amp;gt;System.Text.StringBuilder || &lt;br /&gt;
|-&lt;br /&gt;
| FLOAT (float) || float (System.Single) || &lt;br /&gt;
|-&lt;br /&gt;
| DOUBLE (double) || double (System.Double) || &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:C_Sharp]]&lt;/div&gt;</summary>
		<author><name>192.168.1.17</name></author>
	</entry>
</feed>