Skip to content

Instantly share code, notes, and snippets.

@seraphy
Last active October 30, 2022 13:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seraphy/55e1428ef1b1b551d4730f4d4fe8eadc to your computer and use it in GitHub Desktop.
Save seraphy/55e1428ef1b1b551d4730f4d4fe8eadc to your computer and use it in GitHub Desktop.
Visual Studio 2017 + GtkSharp + Gladeによる、簡単なGTK3のウィンドウアプリの実装例。

GtkSharp + Gladeを使ったシンプルなウィンドウアプリの実装例

準備

Visual Studio 2017 Professional、もしくはVisual Studio 2017 Express for Desktopで実行する。(どちらでも動作した。)

GtkSharpが実行するフレームワークは、Windows環境下であればDotNetFramework4.7以降を使用する。

まずは通常のWindowsアプリとしてプロジェクトを作成する。(Consoleで作成してからWindowにしてもよいし、WindowsFormで作成してFormを全部消してもよい)

次に、NuGetを使って、Mike KestnerさんのGtkSharp.Win32を導入する。

これは、公式のGtkSharpのアセンブリに加えて、それが必要とするネイティブライブラリを導入する。

基本、これだけでGtkSharpによるGTKウィンドウアプリは作成・実行可能になる。

※ 公式のGtkSharpのアセンブリだけだと、ビルドはできるが実行時にネイティブライブラリが見つからず起動できない。(MSys2のGtkのネイティブライブラリにパスを通してあれば動作する)

なお、GtkSharp.Win32がコピーするGtkのネイティブライブラリは32ビット版だけのため、プロジェクトは32ビットでビルドする必要がある。

パッケージの復元

すでに packages.config に依存関係として登録してあるので、これを復元するには、

パッケージクネージャコンソールを開き、

Update-Package -reinstall

でパッケージを復元することができる。

もしくはNuGet CLIを導入していれば、コマンドラインから

nuget restore

でパッケージを復元することができる。

リビジョンに注意

いくつかの環境で試したところ、

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AtkSharp" version="3.22.24.10" targetFramework="net47" />
  <package id="CairoSharp" version="3.22.24.10" targetFramework="net47" />
  <package id="GdkSharp" version="3.22.24.10" targetFramework="net47" />
  <package id="GioSharp" version="3.22.24.10" targetFramework="net47" />
  <package id="GLibSharp" version="3.22.24.10" targetFramework="net47" />
  <package id="GtkSharp" version="3.22.24.10" targetFramework="net47" />
  <package id="GtkSharp.Win32" version="3.1.2" targetFramework="net47" />
  <package id="PangoSharp" version="3.22.24.10" targetFramework="net47" />
</packages>

GtkSharpの3.22.24.?? の末尾の数字が37だと、実行時にネイティブライブラリとのミスマッチが発生して実行できない事象があった。

GtkSharpと、GtkSharp.Win32との間でバージョン連携が取れていないのではないかと思われる。

とりあえず、古いバージョンを指定しておけばOKか? (NuGetで普通にいれると最新が入るので注意)

また、フレームワークのバージョンを 4.7 から 4.7.1 に変えると、上記バージョンが指定できる範囲も変わってくるので、結構センシティブな感じである。

netstandard2.0のマッピングエラーがでる場合

GtkSharpをNuGetで導入すると「アセンブリ 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' に参照を追加する必要があります。」というエラーが出てコンパイルできなくなっている場合がある。

GtkSharpはNetStandard 2.0互換で作成されているライブラリで、DotNet Framework 4.7 であればDotNet Standard 2.0互換のはず。よって明示的にNuGetから入れるようなものではない(というか探しても出てこない)はずだが、このマッピングがうまくいっていないらしい?

VS2017のソースコード編集画面で赤波線が引かれているところで「ALT+ENTER」を押して「考えられる修正を表示」サジェストを表示して、「参照を'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'に追加」みたいな表示があれば、ここで「ENTER」キーを押せば、これらの設定がされてエラーは消える。

何らソース等いじる必要はない。

(package.configには変化はないが、プロジェクトの参照ツリーの下でnetstandardの参照が追加されている。プロジェクトファイルの何かが変わっているのだろうが、ソース管理しているファイル上には変化がないのでdiffとっても違いが分からず厄介である。)

MSys2のGtk環境の準備

GtkSharpを使うにあたり、MSys2のGtkは事前にインストールしておく必要がある。

pacman -S mingw-w64-x86_64-gtk3
pacman -S mingw-w64-i686-gtk3

64bit, 32bitの両方のgtkを導入しておくことで、プロジェクトは、それぞれx64, x86のいずれでもビルドできるようになる。

※ Visual Studioからデバックする場合は64ビット版を使う。

Gladeの使用

GUIのレイアウトにはGladeによるXML形式のレイアウト定義ファイルを使っている。

Windowsの場合は、MSys2 からGTK3, Glade関連を導入することができる。

pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-glade

これでgladeが得られたら、

msys2 MinG64環境下のbashを開いて

glade Form1.glade

のようなコマンドで編集することができる。

ビルド方法

パッケージの復元ができていれば、あとはプロジェクトをVisual Studioで開くか、msbuildから直接ビルドできる。

ビルドすると、bin出力フォルダ下にネイティブライブラリのコピーされ、実行可能なexeが作成される。

bin\debug下には以下のようなMSys2のGtk3ネイティブライブラリを含むdllもコピーされているようである。

AtkSharp.dll
CairoSharp.dll
GdkSharp.dll
GioSharp.dll
GLibSharp.dll
GtkSharp.dll
PangoSharp.dll

iconv.dll
libatk-1.0-0.dll
libcairo-2.dll
libcairo-gobject-2.dll
libffi-6.dll
libgcc_s_sjlj-1.dll
libgdk-3-0.dll
libgdk_pixbuf-2.0-0.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgobject-2.0-0.dll
libgtk-3-0.dll
libintl-8.dll
libpango-1.0-0.dll
libpangocairo-1.0-0.dll
libpangowin32-1.0-0.dll
libpixman-1-0.dll
libpng16-16.dll
libwinpthread-1.dll
zlib1.dll

SimpleGtkSharpAndGladeExample.exe
SimpleGtkSharpAndGladeExample.exe.config
SimpleGtkSharpAndGladeExample.pdb

MSys2のGtkまわりに環境変数PATHを通してなくても、このexeを実行すればGtk3の画面が開く。

GtkSharp.Win32は何をやっているのか?

GtkSharp.Win32は、GtkSharpを依存関係として公式のGtkSharpのアセンブリをロードさせ、且つ、 ビルド時に自分が抱えているGtkまわりのdllをexeと同じ出力ディレクトリにコピーしているだけのようである。

1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libcairo-gobject-2.dl_" から "bin\Debug\\libcairo-gobject-2.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libffi-6.dl_" から "bin\Debug\\libffi-6.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\iconv.dl_" から "bin\Debug\\iconv.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libgcc_s_sjlj-1.dl_" から "bin\Debug\\libgcc_s_sjlj-1.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libcairo-2.dl_" から "bin\Debug\\libcairo-2.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libatk-1.0-0.dl_" から "bin\Debug\\libatk-1.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libgdk-3-0.dl_" から "bin\Debug\\libgdk-3-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libgio-2.0-0.dl_" から "bin\Debug\\libgio-2.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libgdk_pixbuf-2.0-0.dl_" から "bin\Debug\\libgdk_pixbuf-2.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libglib-2.0-0.dl_" から "bin\Debug\\libglib-2.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libgmodule-2.0-0.dl_" から "bin\Debug\\libgmodule-2.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libgobject-2.0-0.dl_" から "bin\Debug\\libgobject-2.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libgtk-3-0.dl_" から "bin\Debug\\libgtk-3-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libintl-8.dl_" から "bin\Debug\\libintl-8.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libpango-1.0-0.dl_" から "bin\Debug\\libpango-1.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libpangocairo-1.0-0.dl_" から "bin\Debug\\libpangocairo-1.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libpangowin32-1.0-0.dl_" から "bin\Debug\\libpangowin32-1.0-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libpixman-1-0.dl_" から "bin\Debug\\libpixman-1-0.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libpng16-16.dl_" から "bin\Debug\\libpng16-16.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\libwinpthread-1.dl_" から "bin\Debug\\libwinpthread-1.dll" へファイルをコピーしています。
1>  "C:\Users\seraphy\git\GtkSharpExample\packages\GtkSharp.Win32.3.1.2\build\net45\zlib1.dl_" から "bin\Debug\\zlib1.dll" へファイルをコピーしています。

GtkSharp.Win32を使わずGtk3まわりのdllを直接使ってみる

GtkSharp.Win32は、2015年のFramework4.5時代からメンテされていないので、早晩、使えなくなることが予想される。

しかし、GtkSharp.Win32がやっていることはネイティブライブラリのコピーだけのようだと分かったので、自分で試してみる。

明示的にパスを通してみる

GtkSharpの公式ページのインストール手順にあるとおり、まずはMSys2のdllを参照できれば、普通に機能するはずではないか、と思い試してみた。

この環境ではMsys2のGtk3は64ビット版しか入れていないので、まず、本アプリを64ビットとしてビルドし直す。

つぎに、生成された上記lib????.dllを削除して明示的にパスを通して実行してみる。

SET PATH=C:\msys64\mingw64\bin
bin\Debug\SimpleGtkSharpAndGladeExample.exe

で、問題なく表示できた。

(C#側をx86でビルドしていたことを失念していてエラーになったりしたのだが、x64ビルドしたら、あっさり通った。)

Gtk3まわりのdllを直接コピーしてみる

この環境のMSys2には64ビット版のGtk3しか入れていないので、プロジェクトを64ビットビルドに変更して、

依存関係からGtkSharp.Win32を切って、GtkSharpだけにし、

Update-Package -reinstallによって、パッケージを入れなおす。(バージョンは最新のGtkSharpで問題ない。)

この状態でビルドしなおす。

当然、ネイティブライブラリはコピーされていないが、まずは、前述のとおり、明示的にパスを通せば動くことを確認する。

つぎにMSys2からGtk3まわりのdllを直接コピーしてみる。(copy_libs.bat参照)

GtkSharp.Win32がコピーしていたファイルをもとに、1つづつ試した結果、以下のものをコピーしたら、とりあえず動くようになった。

(ウェジットによっては更に必要なものもあるのかもしれないが)

libatk-1.0-0.dll
libbz2-1.dll
libcairo-2.dll
libcairo-gobject-2.dll
libdatrie-1.dll
libepoxy-0.dll
libexpat-1.dll
libffi-6.dll
libfontconfig-1.dll
libfreetype-6.dll
libfribidi-0.dll
libgcc_s_seh-1.dll
libgdk-3-0.dll
libgdk_pixbuf-2.0-0.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgobject-2.0-0.dll
libgraphene-1.0-0.dll
libgraphite2.dll
libgtk-3-0.dll
libharfbuzz-0.dll
libiconv-2.dll
libintl-8.dll
libpango-1.0-0.dll
libpangocairo-1.0-0.dll
libpangoft2-1.0-0.dll
libpangowin32-1.0-0.dll
libpcre-1.dll
libpixman-1-0.dll
libpng16-16.dll
libstdc++-6.dll
libthai-0.dll
libwinpthread-1.dll
zlib1.dll

これでパスを通してなくても、エクスプローラからexeを直接起動できるようになった。

参考

http://grbd.github.io/posts/2016/06/25/gtksharp-part-3-basic-example-with-vs-and-glade/

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
</configuration>
@set PLATFORM=%1
@set OUTDIR=%2
if not "%1" == "x64" (
set MINGWBIN=C:\msys64\mingw32\bin
) else (
set MINGWBIN=C:\msys64\mingw64\bin
)
if not "%1" == "x64" (
copy /y %MINGWBIN%\libgcc_s_dw2-1.dll %OUTDIR%
) else (
copy /y %MINGWBIN%\libgcc_s_seh-1.dll %OUTDIR%
)
copy /y %MINGWBIN%\libatk-1.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libbz2-1.dll %OUTDIR%
copy /y %MINGWBIN%\libcairo-2.dll %OUTDIR%
copy /y %MINGWBIN%\libcairo-gobject-2.dll %OUTDIR%
copy /y %MINGWBIN%\libdatrie-1.dll %OUTDIR%
copy /y %MINGWBIN%\libepoxy-0.dll %OUTDIR%
copy /y %MINGWBIN%\libexpat-1.dll %OUTDIR%
copy /y %MINGWBIN%\libffi-6.dll %OUTDIR%
copy /y %MINGWBIN%\libfontconfig-1.dll %OUTDIR%
copy /y %MINGWBIN%\libfreetype-6.dll %OUTDIR%
copy /y %MINGWBIN%\libfribidi-0.dll %OUTDIR%
copy /y %MINGWBIN%\libgdk-3-0.dll %OUTDIR%
copy /y %MINGWBIN%\libgdk_pixbuf-2.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libgio-2.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libglib-2.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libgmodule-2.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libgobject-2.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libgraphene-1.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libgraphite2.dll %OUTDIR%
copy /y %MINGWBIN%\libgtk-3-0.dll %OUTDIR%
copy /y %MINGWBIN%\libharfbuzz-0.dll %OUTDIR%
copy /y %MINGWBIN%\libiconv-2.dll %OUTDIR%
copy /y %MINGWBIN%\libintl-8.dll %OUTDIR%
copy /y %MINGWBIN%\libpango-1.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libpangocairo-1.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libpangoft2-1.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libpangowin32-1.0-0.dll %OUTDIR%
copy /y %MINGWBIN%\libpcre-1.dll %OUTDIR%
copy /y %MINGWBIN%\libpixman-1-0.dll %OUTDIR%
copy /y %MINGWBIN%\libpng16-16.dll %OUTDIR%
copy /y "%MINGWBIN%\libstdc++-6.dll" %OUTDIR%
copy /y %MINGWBIN%\libthai-0.dll %OUTDIR%
copy /y %MINGWBIN%\libwinpthread-1.dll %OUTDIR%
copy /y %MINGWBIN%\zlib1.dll %OUTDIR%
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.14"/>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Simple GtkSharp + Glade Example</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkMenuBar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">ファイル(_F)</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-new</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-open</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-save</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-save-as</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="menuFileQuit">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">編集(_E)</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-cut</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-paste</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-delete</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">表示(_V)</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">ヘルプ(_H)</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem">
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkTextView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AtkSharp" version="3.22.24.37" targetFramework="net47" />
<package id="CairoSharp" version="3.22.24.37" targetFramework="net47" />
<package id="GdkSharp" version="3.22.24.37" targetFramework="net47" />
<package id="GioSharp" version="3.22.24.37" targetFramework="net47" />
<package id="GLibSharp" version="3.22.24.37" targetFramework="net47" />
<package id="GtkSharp" version="3.22.24.37" targetFramework="net47" />
<package id="PangoSharp" version="3.22.24.37" targetFramework="net47" />
</packages>
using System;
using Gtk;
namespace SimpleGtkSharpAndGladeExample
{
class Form1 : Window
{
private Builder _builder;
#region Gladeオブジェクトのinjection
#pragma warning disable 649
[Builder.Object]
private MenuItem menuFileQuit;
#pragma warning restore 649
#endregion
public static Form1 Create()
{
Builder builder = new Builder(null, "SimpleGtkSharpAndGladeExample.Form1.glade", null);
return new Form1(builder, builder.GetObject("window").Handle);
}
protected Form1(Builder builder, IntPtr handle) : base(handle)
{
_builder = builder;
builder.Autoconnect(this);
// ウィンドウを閉じるシグナルの接続
DeleteEvent += OnLocalDeleteEvent;
// メニューのQuitのActivateシグナルの接続
menuFileQuit.Activated += OnFileQuit;
}
protected void OnLocalDeleteEvent(object sender, DeleteEventArgs a)
{
Application.Quit();
a.RetVal = true;
}
protected void OnFileQuit(object sender, EventArgs a)
{
Application.Quit();
}
}
class Program
{
[STAThread]
static void Main()
{
Application.Init();
var form1 = Form1.Create();
form1.Resize(800, 600);
form1.Show();
Application.Run();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
<TargetFrameworkProfile />
<ProjectGuid>{A46138FD-F57A-41FC-82F7-AF02136E902C}</ProjectGuid>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<Prefer32Bit>false</Prefer32Bit>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup>
<OutputType>WinExe</OutputType>
</PropertyGroup>
<PropertyGroup>
<RootNamespace>SimpleGtkSharpAndGladeExample</RootNamespace>
</PropertyGroup>
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="AtkSharp, Version=3.22.24.37, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\AtkSharp.3.22.24.37\lib\netstandard2.0\AtkSharp.dll</HintPath>
</Reference>
<Reference Include="CairoSharp, Version=3.22.24.37, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\CairoSharp.3.22.24.37\lib\netstandard2.0\CairoSharp.dll</HintPath>
</Reference>
<Reference Include="GdkSharp, Version=3.22.24.37, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\GdkSharp.3.22.24.37\lib\netstandard2.0\GdkSharp.dll</HintPath>
</Reference>
<Reference Include="GioSharp, Version=3.22.24.37, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\GioSharp.3.22.24.37\lib\netstandard2.0\GioSharp.dll</HintPath>
</Reference>
<Reference Include="GLibSharp, Version=3.22.24.37, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\GLibSharp.3.22.24.37\lib\netstandard2.0\GLibSharp.dll</HintPath>
</Reference>
<Reference Include="GtkSharp, Version=3.22.24.37, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\GtkSharp.3.22.24.37\lib\netstandard2.0\GtkSharp.dll</HintPath>
</Reference>
<Reference Include="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
<Reference Include="PangoSharp, Version=3.22.24.37, Culture=neutral, processorArchitecture=MSIL">
<HintPath>packages\PangoSharp.3.22.24.37\lib\netstandard2.0\PangoSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Form1.glade" />
</ItemGroup>
<ItemGroup>
<None Include="app.config">
<SubType>Designer</SubType>
</None>
<None Include="1_README.md" />
<None Include="copy_libs.bat" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<Exec Command="cmd.exe /C copy_libs.bat $(PLATFORM) $(OutputPath)" />
</Target>
</Project>

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.421
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleGtkSharpAndGladeExample", "SimpleGtkSharpAndGladeExample.csproj", "{A46138FD-F57A-41FC-82F7-AF02136E902C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A46138FD-F57A-41FC-82F7-AF02136E902C}.Debug|x64.ActiveCfg = Debug|x64
{A46138FD-F57A-41FC-82F7-AF02136E902C}.Debug|x64.Build.0 = Debug|x64
{A46138FD-F57A-41FC-82F7-AF02136E902C}.Debug|x86.ActiveCfg = Debug|x86
{A46138FD-F57A-41FC-82F7-AF02136E902C}.Debug|x86.Build.0 = Debug|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5100C2DC-468E-49BB-B21B-CA06F4BF0505}
EndGlobalSection
EndGlobal
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment