差分

ナビゲーションに移動 検索に移動

C♯のモジュールからC++のDLLを呼び出してみる

3,498 バイト除去, 2019年7月26日 (金) 16:46
= インストール =pacmanを使って普通にインストールしていきます。<br/>(最新かも忘れずに…)<syntaxhighlight lang="bash">pacman -Syupacman -S gnome</syntaxhighlight>久しぶりにやったら、すっかり忘れていたので覚書…
= ネットワークマネージャーの起動 =C++のDLLプロジェクト作成 ==まず、C++のDLLを作成するときの注意点…「GNOME」ではネットワーク管理に「NetworkManager」を使用しています。作成するプロジェクトは、「Win32プロジェクト」を選択するんだ。<br/>「GNOME」に合わせて?NetworkManagerがインストールされるので、起動と自動起動の設定をします。<syntaxhighlight lang="bash">systemctl start NetworkManagersystemctl enable NetworkManager</syntaxhighlight>[[ファイル:CShapeToCppDll-005.jpg]]
= GDMの起動 =
今の状態で起動してもログイン画面が表示されません。<br/>
ログイン画面を表示するためには「gdm」を起動します。<br/>
以下のコマンドで、gdmの起動と自動起動の設定をします。
<syntaxhighlight lang="bash">systemctl start gdm
systemctl enable gdm</syntaxhighlight>
= 起動 =コンソールで起動する場合は、以下のコマンドを実行します。あと…アプリケーションの設定では「DLL」と「空のプロジェクト」を選択してね。<br/>(すでにログインしている状態なので、ログイン画面は表示されません)<syntaxhighlight lang="bash">XDG_SESSION_TYPE=wayland dbus[[ファイル:CShapeToCppDll-run-session gnome-session001.jpg]]<br/syntaxhighlight>
= 日本語化 =
起動できても、今のところすべてが英語で表示されています。<br/>
日本人なので、日本語に直しておきます。
== キーボードの変更 ==英語キーボードを使用している人はそのままで良いのですが、106(または109)キーボードを使用している人は、切り替えます。空のプロジェクトが作成されたら「cpp」「h」「def」ファイルを追加するんだ。今回は「CppDll.cpp」「CppDll.h」「CppDll.def」を追加したよ。
画面右上をクリックして、歯車アイコン(設定)をクリックします。<br/>
[[ファイル:archlinux-gnome-001.png | 400px]]
「Region & Language」をクリックして、「Input Sources」の「+」マークをクリックします。そしたら、プロジェクトのプロパティを開いて「構成プロパティ→リンカー→入力→モジュール定義ファイル」に「CppDll.def」を設定するんだ。<br/>(DebugとReleaseでそれぞれ設定する必要があるんだよ。)<br/>[[ファイル:archlinuxCShapeToCppDll-gnome-010002.png | 400pxjpg]]<br/>
(画面上は「japanese」が表示されていますが…表示されていないはずです)== DLLのコード ===== ヘッダーファイル(*.h) ===<br/syntaxhighlight lang="cpp">縦向きの「…」をクリックします。<br/>#ifndef DLLAPI#define DLLAPI extern "C" __declspec(dllimport)[[ファイル:archlinux-gnome-011.png | 400px]]#endif
ウインドウ下部の検索ボックスに「japanese」を入力してします。<br/>DLLAPI long __stdcall _Sum(const long p_Number1, const long p_Number2);「japanese」が表示されたら、それをクリクします。<br/syntaxhighlight>[[ファイル:archlinux-gnome-012.png | 400px]]
使用しているキーボードの種類に合わせて、選択します。<br/>キーボードの種類がわからない人は「[http://qa=== コードファイル(*.elecom.co.jp/faq_detail.html?idcpp) ===5262 キーボードの種類を知りたい/106、109キーボードとは?/英語、日本語キ...]」を見るとわかるかもしれません。<br/>選択したら「Add」ボタンをクリックします。<br/syntaxhighlight lang="cpp">[[ファイル:archlinux-gnome-013.png | 400px]]#define DLLAPI
優先順位を変更します。<br/>「japanese」をドラッグして、「English」の上にドロップします。<br/>[[ファイル:archlinux-gnome-014#include "CppDll.png | 400px]]h"
「✕」をクリックして閉じます。DLLAPI long __stdcall _Sum(const long p_Number1, const long p_Number2){ return p_Number1 + p_Number2;}<br/syntaxhighlight>[[ファイル:archlinux-gnome-015.png | 400px]]
画面上部の「en▼」をクリックして、「japanese」を選択します。=== モジュール定義ファイル(*.def) ===<br/syntaxhighlight lang="text">[[ファイル:archlinux-gnome-016.png | 400px]]LIBRARY CppDll
EXPORTS
_Sum
</syntaxhighlight>
このやり方では、「English」を生かしていますが、使わないなら削除しても良いかと思います。<br/>== C♯のプロジェクト作成 ==ドラッグ・アンド・ドロップした所で、「English」右横の「✕」をクリックすると削除できます。<br/>(検証していないので保証はしかねますが…)ほとんどそのまま作るんだけど…ソリューションのコンパイル対策をしておくよ。
== ロケールの変更 = ビルドイベントの設定 ===インストール時は「en_US.UTF-8」で設定しましたが、日本語に変更しますC++のDLLはソリューションフォルダ直下の「Debug」や「Release」フォルダにDLLが格納されてしまうんだ。そうすると、デバッグするときにDLLが見つからないので、ビルドイベントを使ってコピーしてしまうよ。以下のように設定してね。(「Release」コンパイルするまでは「Release」フォルダがないのでコメントアウトしているよ)<br/>「/etc/locale[[ファイル:CShapeToCppDll-004.conf」ファイルの内容を以下の様に修正します。jpg]]<br/>
修正前=== プロジェクトの依存関係の設定 ===コピーするにもちゃんとリコンパイルされた資源をコピーしないといけないので、プロジェクトの依存関係を設定することで、ビルドの順番を設定するよ。<syntaxhighlight lang="bash"Br/>LANG=en_US.UTF-8ソリューションエクスプローラーからC♯のプロジェクトを右クリックして「ビルド依存関係」→「プロジェクト依存関係」を選択してね。<br/syntaxhighlight>「依存関係」タブの依存先にC++のプロジェクトが表示されているはずだから、チェックを入れてOKボタンをクリックしてね。
修正後== C♯のコード ==MVVMモデルでサンプルを作ったからビューモデルが入っているけど…DLLを呼ぶには必要ないから無視してね。=== モデル ===<syntaxhighlight lang="bashC#">#LANG=en_USusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.UTF-8Navigation;LANG=ja_JPusing System.Windows.UTF-8</syntaxhighlight>Shapes;
== 日本語フォントのインストール ==文字コードが日本語になっても、フォントがインストールされていなければ表示できません。<br/>なので、日本語フォントをインストールします。<br/>今回は、IPA提供の「otf-ipafont」をインストールします。追加<syntaxhighlight lang="bash">pacman -S otf-ipafont</syntaxhighlight>using System.Runtime.InteropServices;
namespace CSharpToCDLL{ /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { /// <summary> /// DLLの関数定義 /// </summary> /// <param name="p_Number1">数値1</param> /// <param name= GUIから設定変更 =="p_Number2">数値2</param> /// <returns>合計</returns> [DllImport("CppDll.dll")]※ロケールの変更と、フォントのインストールを済ませてから、ログインすると勝手に変わる場合があるみたいです。 private extern static Int32 _Sum(Int32 p_Number1,Int32 p_Number2);
画面右上をクリックしてメニューを表示して、歯車アイコン(設定)をクリックします。 /// <summary> /// 標準のコンストラクタ /// <br/summary>[[ファイル:archlinux-gnome-001.png | 400px]] public MainWindow() { InitializeComponent(); }
左のリストから「Region & Language」をクリックして、「Formats」をクリックします。 /// <summary> /// ボタンクリックイベントハンドラ /// </summary> /// <param name="sender">イベント送信元</param> /// <param name="e">イベント情報<br/param>[[ファイル:archlinux-gnome-002.png | 400px]] private void Button_Click(object sender, RoutedEventArgs e) { //DLLの関数を呼び出す Int32 l_Result = _Sum(300, 500);
一覧から「日本」にチェックを入れて、「Done」をクリックします。 //計算結果の表示 MessageBox.Show("計算結果:" + l_Result.ToString()); } }}<br/syntaxhighlight>[[ファイル:archlinux-gnome-003.png | 400px]]
「Restart」を無視して、「Language」をクリックします。=== ビュー ===<source lang="xml"><Window x:Class="CSharpToCDLL.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="77.056" Width="525"> <brGrid> <Grid.RowDefinitions> <RowDefinition Height="5"/>[[ファイル:archlinux-gnome-004 <RowDefinition Height="24"/> <RowDefinition/> <RowDefinition Height="5"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="5"/> <ColumnDefinition/> <ColumnDefinition Width="5"/> <ColumnDefinition Width="75"/> <ColumnDefinition Width="5"/> </Grid.ColumnDefinitions> <Label Grid.Row="1" Grid.Column="1" Content="{Binding Label_Content}"/> <Button Grid.Row="1" Grid.Column="3" Content="実行" Click="Button_Click"/> </Grid></Window></source>=== ビューモデル ===<source lang="csharp">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.png | 400px]]Tasks;
一覧から「日本語」を選択して、「Select」をクリックします。<br/>/追加[[ファイル:archlinux-gnome-005using System.png | 400px]]ComponentModel;
「Restart」をクリックします。namespace CSharpToCDLL{ class MainWindowViewModel : INotifyPropertyChanged { /// <brsummary> /// ラベル表示用変数 /// </summary>[[ファイル:archlinux-gnome-006.png | 400px]] private String m_Label_Content;
ログアウトを促されるので、「Log Out」をクリックして、ログアウトします。 /// <brsummary> /// ラベル表示文字列 /// </summary>[[ファイル:archlinux-gnome-007 public String Label_Content { set { this.png | 400px]]m_Label_Content = value; this.OnPropertyChanged("Label_Content"); } get { return this.m_Label_Content; } }
/// <summary>
/// プロパティ変更イベントハンドラ
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
ログアウトしたら、ログイン画面からログインします。 /// <summary> /// プロパティ変更通知 /// </summary> /// <param name="p_PropertyName">プロパティ名</param> public void OnPropertyChanged(String p_PropertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(p_PropertyName)); } } }}</source>
ここは人によるかと思いますが…。<br/>homeディレクトリ配下の色々なフォルダ名を日本語にするか聞いてきます。<br/>必要に応じて「古い名前のままにする」「名前を変更する」のどちらかを選択します<br/>[[ファイルCategory:archlinux-gnome-008.png | 400pxC♯]] 以下の画像の通り、日本語になります。<br/>[[ファイルCategory:archlinux-gnome-009.png | 400px]] == 日本語入力のインストールと設定 ==画面上は日本語になりましたが、まだ日本語の入力が出来ません。<br/>日本語入力できるようにしていきます。<br/>今回は「linux版google日本語入力」を入れていきます 下記コマンドをターミナルで実行します。<syntaxhighlight lang="bash">pacman -S fcitx-im fcitx-configtool fcitx-mozc</syntaxhighlight> ずらずらぁ~っとインストールされます。 ここで、ArchLinuxのFcitxのサイトでは「[https://wiki.archlinux.jp/index.php/Fcitx 以下の行をデスクトップのスタートアップスクリプトファイル (GDM, LightDM, SDDM を使っている場合は .xprofile もしくは .profile、startx や Slim を使っている場合は .xinitrc、Wayland を使っている場合は /etc/environment) に追加してください。]」と書いてあるので、その通りやっても動かなかった…。 色々と調べたら「[https://blog.masudak.net/entry/2015/08/04/200000 ~/.profileが読み込まれなくて困ったら、ここを見る! - カイワレの大冒険 Third]」にたどり着いて…<br/>ホームディレクトリのファイルを見ると…* .profile…無い* .xprofile…無い* .bash_login…無い* .bash_profile…これ! つ~事で「.bash_profile」ファイルに以下を追記します。<br/><syntaxhighlight lang="bash">export GTK_IM_MODULE=fcitxexport QT_IM_MODULE=fcitxexport XMODIFIERS=@im=fcitx</syntaxhighlight> GUIでログインしてテキストエディタで、「CtrlC++Space」または「全角/半角」「E/J」キーを押すと、日本語入力できるかと思います。 ちなみにsshなどで接続している場合は、クライアント側の[https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5#%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5 FEP](古いwww)で入力されるので問題ありません。 = 経験したトラブル === ネットワークのアイコンに「?」が出た ==環境にもよるのですが…NetworkManagerは一定間隔で、接続確認をしているそうです。<ref name="NetworkIcon_Less" /><br/>例えば、認証プロキシ配下で動作させると、当然認証前は接続確認できないわけで…<br/>その結果ネットワークのアイコンに「?」が出るそうです。<br/>という訳で、接続確認をしないようにします。 やり方は「/etc/NetworkManager/conf.d」ディレクトリに、任意のconfファイル(参考サイトだと「20-connectivity.conf 」)を以下の内容で作成します。<syntaxhighlight lang="text">[connectivity]uri=</syntaxhighlight>(必要に応じてNetworkManagerを再起動) これで、接続確認しなくなるようです。 == ネットワークの設定が沢山 ==GUIでネットワークの設定が、NICのデバイス名の他、有線接続1など複数表示されてしまいました。<br/>しかも、有効になっているのはNICのデバイス名の方…(Debianの経験から「有線接続1」が有効になってほしい…)<br/>なんとなく心当たりが…<br/>インストールの時に「dhcpcdサービス」を有効にしたのが原因ぽいです。<br/>(GNOMEはNetworkManagerで管理してますから…)<br/> そこで以下のコマンドで、dhcpcdサービスを無効化します。<syntaxhighlight lang="bash">systemctl disable dhcpcd@[interface].service</syntaxhighlight>[interface]をNICのデバイス名に置き換えてください。 これできれいになりました!!! = 参考サイト =[https://wiki.archlinux.jp/index.php/GNOME GNOME - ArchWiki]<br/>[http://note.kurodigi.com/post-0-19/ Arch Linuxに日本語環境を構築する]<br/>[http://qa.elecom.co.jp/faq_detail.html?id=5262 キーボードの種類を知りたい/106、109キーボードとは?/英語、日本語キ...]<br/>[https://wiki.archlinux.jp/index.php/Fcitx Fcitx - ArchWiki]<br/>[https://blog.masudak.net/entry/2015/08/04/200000 ~/.profileが読み込まれなくて困ったら、ここを見る! - カイワレの大冒険 Third]<br/> = 脚注 =<references><ref name="NetworkIcon_Less">[https://forum.manjaro.org/t/working-ethernet-connection-now-shows-question-mark-icon/43556 Working ethernet connection now shows question mark icon - Newbie Corner - Manjaro Linux Forum]</ref></references> [[Category:ArchLinux]][[Category:GNOMEdll]]

案内メニュー