SlideShare une entreprise Scribd logo
1  sur  36
他言語との連携
ネイティブから動的な言語まで。
(別言語からC#にWellcom)

C#の素晴らしさを語る会
自己紹介
名前
石川達也
所属
株式会社Codeer代表取締役
(http://www.codeer.co.jp/)
技術
C、C++、C++/CLI、C#、少しJava
組み込みとか、Windowsアプリとか。
趣味
ギター
まずは、ネイティブとの連携
まだまだ、ネイティブアプリは世の中にあふれて
いる!
ストーリー
Win32アプリのメンテをしています。

そして、ある日上司から唐突に作業依頼がやってきました。
次の仕様追加で作る画面、
WPFで作ってくれない?
流行ってんでしょ?

流行ってる
か・・・?
(でたよ、思い付き・・・)
でも、あなたは、答えました。

「Yes, sir」
なぜなら、WPFで作るということは・・・。
大好きなC#を仕事で使えるか
ら!
備考

でも、この思い付きは意外と良いんです。
Nativeアプリを一気に.Netで作り変えるのは大変!
その過程で、チームに.Netのノウハウが溜まるのです。
方法は複数あり、それぞれ長所短所があ
る。
・ネイティブをC++/CLIにする
・C++/CLIでブリッジをつくる
・COM相互運用
・P/Invoke

・ホストAPI

私はこれをよく使って
ます
今回はC#とC++のみで、やってみ
ます。 ・ネイティブをC++/CLIにする

割愛

・C++/CLIでブリッジをつくる
・COM相互運用
・P/Invoke

・ホストAPI
レシピはこんなもんかな・・・
8Hほど煮込みまし
た。
あれ?
これ、いつもやってるやつより良くね? (゚
д゚ノ)ノ
なんで、今までC++/CLI使ってたの? (T-T)
ていうか、やっぱり・・・・。
C#って素晴らし
い!
では、コードをどうぞ~。

弊社サイトからDwonLoad可能です。
Codeerで検索→技術メモ→ネイティブと.Netの連携
http://www.codeer.co.jp/technical-notes/NativeAndNet
概略図

ManagedExporter.dll

ManagedImporter

IInterfaceTable

ObjectProxy

WpfGui.dll

Win32App.exe

InputDataDialog : IInterfaceTable

InputDataDialog : ObjectProxy

InputData : IInterfaceTable

InputData : ObjectProxy

★最初にObjectProxy::Initを一回呼びます。
まとめると、

Delegateを関数ポインタにしてネイティブから使
おう!
って作戦です。
初期化
ホストAPIで.Net呼び出し。
関数ポインタちょうだい。

ManagedExporter.dll

ManagedImporter
//関数ポインタをstaticに保持
ExportInfo s_Create(path, assembly, typeFullName);
void s_Free(handle);

・生成関数(delegate)
・解放関数(delegate)
・ホストAPI(メンド
い)
//COMインターフェイス取得
CLRCreateInstance(..., IID_PPV_ARGS(&pMetaHost));
pMetaHost->GetRuntime(..., IID_PPV_ARGS(&pRuntimeInfo));
pRuntimeInfo->GetInterface(..., IID_PPV_ARGS(&pClrRuntimeHost));
//ランタイム開始
pClrRuntimeHost->Start();
//文字列指定で.Netのstaticメソッドを呼び出し。
//型はint func(string args)
pClrRuntimeHost->ExecuteInDefaultAppDomain(...)

ObjectProxy::Init(L"v4.0.30319");

・delegateを関数ポインタに変換
IntPtr ptr = Marshal.GetFunctionPointerForDelegate(func);
注意点としてdelegateのオブジェクトをGCで
回収されないようにする必要があります。
方法は複数あります。
・Static変数にする
・GC.KeepAlive
・GCHandle.Alloc

Win32App.exe
オブジェクト生成

ManagedExporter.dll

ManagedImporter

IInterfaceTable

Info s_Create(path, assembly, type);

・リフレクションで生成。
・ IInterfaceTableを使ってDelegateを取得。
・関数名でDelegateを取得できるDelegateを作成。
・ GCHandle.Allocで寿命を確保。
・ネイティブに返す。

InputDataDialog::InputDataDialog()
: ObjectProxy(AssemblyPathLocal,
"WpfGui.dll",
"WpfGui.InputDataDialog")

//マネージドクラス公開情報。
typedef void* (__stdcall *GetInterface)(name);
struct ExportInfo
{
HANDLE handle;
GetInterface getInterface;
};

WpfGui.dll

InputDataDialog : IInterfaceTable

Win32App.exe

InputDataDialog : ObjectProxy
インターフェイスマッピング

ManagedExporter.dll
IInterfaceTable

ManagedImporter
Info s_Create(path, assembly, type);

BIND_PROXY_METHOD(SetOwner);
BIND_PROXY_METHOD(DoModal);
BIND_PROXY_METHOD(GetInputData);
//マネージドクラス公開情報。
typedef void* (__stdcall *GetInterface)(name);
struct ExportInfo
{
HANDLE handle;
GetInterface getInterface; ←これを使う
};

Win32App.exe

InputDataDialog : ObjectProxy
逆に.Netからネイティブのクラスを使う。
P/Invoke
void DisplayInfo::SetTitle(LPCWSTR title)
{
_strTitle = title;
}
HGLOBAL DisplayInfo::GetTitle()
{
size_t size = (_strTitle.length() + 1) * 2;
HGLOBAL global = ::GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, size);
memcpy((void*)global, _strTitle.c_str(), size);
return global;
}
//Exeでも公開関数を定義することは可能です。
extern "C"
{
__declspec(dllexport) void __cdecl DisplayInfoSetTitle(void* ptr, LPCWSTR title)
{
return ((DisplayInfo*)ptr)->SetTitle(title);
}
__declspec(dllexport) HGLOBAL __cdecl DisplayInfoGetTitle(void* ptr)
{
return ((DisplayInfo*)ptr)->GetTitle();
}
__declspec(dllexport) void __cdecl DisplayInfoDelete(void* ptr)
{
delete ptr;
}
}
class DisplayInfo : IDisposable
{
IntPtr _core;
public DisplayInfo(IntPtr core)
{
_core = core;
}
public string Title
{
get
{
IntPtr ptr = DisplayInfoGetTitle(_core);
string title = Marshal.PtrToStringUni(ptr);
Marshal.FreeHGlobal(ptr);
return title;
}
set
{
DisplayInfoSetTitle(_core, value);
}
}
protected virtual void Dispose(bool disposing)
{
if (disposing && _core != IntPtr.Zero)
{
DisplayInfoDelete(_core);
_core = IntPtr.Zero;
}
}
[DllImport("Win32App.exe")]
static extern IntPtr DisplayInfoGetTitle(IntPtr core);
[DllImport("Win32App.exe", CharSet = CharSet.Unicode)]
static extern void DisplayInfoSetTitle(IntPtr core, string title);
[DllImport("Win32App.exe")]
static extern void DisplayInfoDelete(IntPtr core);
}
dynamic
動的言語との連携
次の指令が来ました。
その、画面の処理、ユーザにスクリプト
で
カスタマイズさせたりできない?

Rubyとか。

流行ってるんでしょ?

Windowsではそうでもな
いと思うけど・・・
ま、Rubyには興味あったし、
やってみるか!
Rubyのコード
class Formatter
def SetName(name)
@name = name
end
def SetAge(age)
@age = age
end

def SetLangauge(langauge)
@langauge = langauge
end
def Format
@name + "rn" + @age.to_s + "rn" + @langauge;
end
end
C#から使う。

internal static string Execute(InputData data)
{
//実行
var ir = IronRuby.Ruby.CreateRuntime();
ir.ExecuteFile(@"..formatter.rb");
//クラス生成
var type = ir.Globals.GetVariable("Formatter");
dynamic formatter = ir.Operations.CreateInstance(type);
//普通に使える
formatter.SetName(data.Name);
formatter.SetAge(data.Age);
formatter.SetLangauge(data.Langauge);
return (string)formatter.Format();
}
dynamicで表されるRubyのクラスの正体は?
class RubyObject : IRubyDynamicMetaObjectProvider

interface IRubyDynamicMetaObjectProvider : IDynamicMetaObjectProvider

public interface IDynamicMetaObjectProvider
{
DynamicMetaObject GetMetaObject(Expression parameter);
}
IDynamicMetaObjectProviderを実装したクラスをdynamicに入れると、
メソッド、プロパティー、フィールド解決時にGetMetaObjectを呼び出
してくれる。
なので、RubyObjectクラスがRubyに特化した解決をしてくれる。
*注)通常はIDynamicMetaObjectProviderではなく、
DynamicObjectを継承して実装します。
使う側は優雅!

RubyObjectが頑張ってくれている。
Dynamicは、これだけでなく、
動的なインターフェイスを持つライブラリに優雅なインターフェイスを与え
てくれる!
XML操作とか

COMとかね。
あなたも、そんなライブラリ持っていませんか?
弊社にはあります。
無料

Codeeer.Friendly.Dynamic

http://www.codeer.co.jp/AutoTest
対象プロセスを
強力な操作方法(おそらく世界で唯
一)で
テスト用に操作するライブラリです。

軽くデ
モ・・・
以前は・・・
AppVar mainForm = _app[typeof(Application), "OpenForms"]()["[]"](0);
AppVar result = mainForm["MyMethod"]("100");
int value = (int)result.Core;
Assert.AreEqual(101, value);

dynamicを使うと・・・
dynamic mainForm = _app.Type<Application>().OpenForms[0];
int value = mainForm.MyMethod("100");
Assert.AreEqual(101, value);

やってることは、実質変わりませんが、可読性と学習効率がUpし
ました。
お客様に使ってもらっているのですが、サポートも減りました。
ご清聴ありがとうございました。

Contenu connexe

Tendances

Delphi ideを使わない開発スタイルの紹介
Delphi ideを使わない開発スタイルの紹介Delphi ideを使わない開発スタイルの紹介
Delphi ideを使わない開発スタイルの紹介
Shinya Okano
 
組み込みプログラマとテスト駆動開発
組み込みプログラマとテスト駆動開発組み込みプログラマとテスト駆動開発
組み込みプログラマとテスト駆動開発
bei_kan
 
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
Yuta Shimakawa
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
Tatsuhiko Yamamura
 

Tendances (20)

Delphi ideを使わない開発スタイルの紹介
Delphi ideを使わない開発スタイルの紹介Delphi ideを使わない開発スタイルの紹介
Delphi ideを使わない開発スタイルの紹介
 
「Delphiのマイグレーションを行うのであれば、これだけは知っておこう!」
「Delphiのマイグレーションを行うのであれば、これだけは知っておこう!」「Delphiのマイグレーションを行うのであれば、これだけは知っておこう!」
「Delphiのマイグレーションを行うのであれば、これだけは知っておこう!」
 
メトロスタイルってなに?
メトロスタイルってなに?メトロスタイルってなに?
メトロスタイルってなに?
 
プロ文.com 勉強会 Phase 1
プロ文.com 勉強会 Phase 1プロ文.com 勉強会 Phase 1
プロ文.com 勉強会 Phase 1
 
組み込みプログラマとテスト駆動開発
組み込みプログラマとテスト駆動開発組み込みプログラマとテスト駆動開発
組み込みプログラマとテスト駆動開発
 
【schoo WEB-campus】#44 エンジニアのマネジメント 先生:伊勢幸一
【schoo WEB-campus】#44 エンジニアのマネジメント 先生:伊勢幸一【schoo WEB-campus】#44 エンジニアのマネジメント 先生:伊勢幸一
【schoo WEB-campus】#44 エンジニアのマネジメント 先生:伊勢幸一
 
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
 
あるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクルあるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクル
 
Visual Studio 2010の使い方
Visual Studio 2010の使い方Visual Studio 2010の使い方
Visual Studio 2010の使い方
 
.Net技術でこれからも食べていくための技術戦略
.Net技術でこれからも食べていくための技術戦略.Net技術でこれからも食べていくための技術戦略
.Net技術でこれからも食べていくための技術戦略
 
「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」
「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」 「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」
「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」
 
Talknoteとgolangと私
Talknoteとgolangと私Talknoteとgolangと私
Talknoteとgolangと私
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
 
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 20174 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
 
Talknoteとgolangと私
Talknoteとgolangと私Talknoteとgolangと私
Talknoteとgolangと私
 
Unityネイティブプラグイン
UnityネイティブプラグインUnityネイティブプラグイン
Unityネイティブプラグイン
 
Web制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテストWeb制作者視点で理解するソフトェアテスト
Web制作者視点で理解するソフトェアテスト
 
デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発デザイン領域へiOS / Android開発
デザイン領域へiOS / Android開発
 
ユーザーショーケース「C++Builderを用いたマルチOS対応一般コンシューマ向けスマートフォンアプリ開発事例」
ユーザーショーケース「C++Builderを用いたマルチOS対応一般コンシューマ向けスマートフォンアプリ開発事例」ユーザーショーケース「C++Builderを用いたマルチOS対応一般コンシューマ向けスマートフォンアプリ開発事例」
ユーザーショーケース「C++Builderを用いたマルチOS対応一般コンシューマ向けスマートフォンアプリ開発事例」
 
2021/05 開発後記
2021/05 開発後記2021/05 開発後記
2021/05 開発後記
 

Similaire à 他言語との連携(ネイティブから動的言語まで)

EclipseもXcodeも窓から投げ捨てろ!
EclipseもXcodeも窓から投げ捨てろ!EclipseもXcodeも窓から投げ捨てろ!
EclipseもXcodeも窓から投げ捨てろ!
Yutaka Tsumori
 
C#でiPhoneアプリ開発 with MonoTouch
C#でiPhoneアプリ開発 with MonoTouchC#でiPhoneアプリ開発 with MonoTouch
C#でiPhoneアプリ開発 with MonoTouch
Shin Ise
 

Similaire à 他言語との連携(ネイティブから動的言語まで) (20)

JXUG Windowsアプリを開発している皆さん、C#でスマホアプリ開発を試してみませんか?ハンズオン
JXUG Windowsアプリを開発している皆さん、C#でスマホアプリ開発を試してみませんか?ハンズオンJXUG Windowsアプリを開発している皆さん、C#でスマホアプリ開発を試してみませんか?ハンズオン
JXUG Windowsアプリを開発している皆さん、C#でスマホアプリ開発を試してみませんか?ハンズオン
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
C#のやさしさを語る時間
C#のやさしさを語る時間C#のやさしさを語る時間
C#のやさしさを語る時間
 
FriendlyによるWindowsアプリテスト自動化手法 基礎技術編
FriendlyによるWindowsアプリテスト自動化手法 基礎技術編FriendlyによるWindowsアプリテスト自動化手法 基礎技術編
FriendlyによるWindowsアプリテスト自動化手法 基礎技術編
 
デブサミ2013 【15-B-2】iOS/Android向け開発をビジュアルに!
デブサミ2013 【15-B-2】iOS/Android向け開発をビジュアルに!デブサミ2013 【15-B-2】iOS/Android向け開発をビジュアルに!
デブサミ2013 【15-B-2】iOS/Android向け開発をビジュアルに!
 
EclipseもXcodeも窓から投げ捨てろ!
EclipseもXcodeも窓から投げ捨てろ!EclipseもXcodeも窓から投げ捨てろ!
EclipseもXcodeも窓から投げ捨てろ!
 
Windows 10 対応のデスクトップアプリを 作る技術(事前公開版)
Windows 10 対応のデスクトップアプリを 作る技術(事前公開版)Windows 10 対応のデスクトップアプリを 作る技術(事前公開版)
Windows 10 対応のデスクトップアプリを 作る技術(事前公開版)
 
Friendly
FriendlyFriendly
Friendly
 
monoでWindowsアプリを動かす
monoでWindowsアプリを動かすmonoでWindowsアプリを動かす
monoでWindowsアプリを動かす
 
Jenkinsからはじめた若者のための新ツール一歩目
Jenkinsからはじめた若者のための新ツール一歩目Jenkinsからはじめた若者のための新ツール一歩目
Jenkinsからはじめた若者のための新ツール一歩目
 
BlackJack
BlackJackBlackJack
BlackJack
 
無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発無料環境でWindows Mobileアプリ開発
無料環境でWindows Mobileアプリ開発
 
C#/WPFで作るデスクトップマスコット入門
C#/WPFで作るデスクトップマスコット入門C#/WPFで作るデスクトップマスコット入門
C#/WPFで作るデスクトップマスコット入門
 
「マルチデバイスの荒海にこぎ出す新人エンジニアのためのソフトウェア開発の心得」
 「マルチデバイスの荒海にこぎ出す新人エンジニアのためのソフトウェア開発の心得」  「マルチデバイスの荒海にこぎ出す新人エンジニアのためのソフトウェア開発の心得」
「マルチデバイスの荒海にこぎ出す新人エンジニアのためのソフトウェア開発の心得」
 
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
 
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
 
勉強会用Swift授業2018-0126
勉強会用Swift授業2018-0126勉強会用Swift授業2018-0126
勉強会用Swift授業2018-0126
 
HTML5でハイブリットなアプリ開発をアレしてみた件
HTML5でハイブリットなアプリ開発をアレしてみた件HTML5でハイブリットなアプリ開発をアレしてみた件
HTML5でハイブリットなアプリ開発をアレしてみた件
 
C#でiPhoneアプリ開発 with MonoTouch
C#でiPhoneアプリ開発 with MonoTouchC#でiPhoneアプリ開発 with MonoTouch
C#でiPhoneアプリ開発 with MonoTouch
 
Swiftビギナーズ勉強会 第1回 @Co-Edo
Swiftビギナーズ勉強会 第1回 @Co-EdoSwiftビギナーズ勉強会 第1回 @Co-Edo
Swiftビギナーズ勉強会 第1回 @Co-Edo
 

Plus de Tatsuya Ishikawa

価値あるシステムテスト自動化の実現By friendly
価値あるシステムテスト自動化の実現By friendly価値あるシステムテスト自動化の実現By friendly
価値あるシステムテスト自動化の実現By friendly
Tatsuya Ishikawa
 
Ride on azure~アイデアソン編~
Ride on azure~アイデアソン編~Ride on azure~アイデアソン編~
Ride on azure~アイデアソン編~
Tatsuya Ishikawa
 
私とC++ in 例外安全day
私とC++ in 例外安全day私とC++ in 例外安全day
私とC++ in 例外安全day
Tatsuya Ishikawa
 
Friendlyを使ったwindowsアプリテスト自動化
Friendlyを使ったwindowsアプリテスト自動化Friendlyを使ったwindowsアプリテスト自動化
Friendlyを使ったwindowsアプリテスト自動化
Tatsuya Ishikawa
 

Plus de Tatsuya Ishikawa (20)

burikaigi2024.pptx
burikaigi2024.pptxburikaigi2024.pptx
burikaigi2024.pptx
 
【オンライン】.NET 6 移行祭り! C# Tokyo イベント
【オンライン】.NET 6 移行祭り! C# Tokyo イベント【オンライン】.NET 6 移行祭り! C# Tokyo イベント
【オンライン】.NET 6 移行祭り! C# Tokyo イベント
 
burikaigi2023
burikaigi2023burikaigi2023
burikaigi2023
 
Test to net core 3
Test to net core 3Test to net core 3
Test to net core 3
 
Test automation strategy for .net core 3 transition
Test automation strategy for .net core 3 transitionTest automation strategy for .net core 3 transition
Test automation strategy for .net core 3 transition
 
Developer summit codeer
Developer summit codeerDeveloper summit codeer
Developer summit codeer
 
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
 
Stack2017 自動化困難な状況での活動方法
Stack2017 自動化困難な状況での活動方法Stack2017 自動化困難な状況での活動方法
Stack2017 自動化困難な状況での活動方法
 
メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)メタな感じのプログラミング(プロ生 + わんくま 071118)
メタな感じのプログラミング(プロ生 + わんくま 071118)
 
Dot netconf2017 - VS拡張
Dot netconf2017 - VS拡張Dot netconf2017 - VS拡張
Dot netconf2017 - VS拡張
 
.Netconf
.Netconf.Netconf
.Netconf
 
価値あるシステムテスト自動化の実現By friendly
価値あるシステムテスト自動化の実現By friendly価値あるシステムテスト自動化の実現By friendly
価値あるシステムテスト自動化の実現By friendly
 
Stac2014 石川
Stac2014 石川Stac2014 石川
Stac2014 石川
 
Bindingからframework elementを見つける
Bindingからframework elementを見つけるBindingからframework elementを見つける
Bindingからframework elementを見つける
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
 
Friendlyで始めるwindowsアプリシステムテスト自動化+内部使用技術解説
Friendlyで始めるwindowsアプリシステムテスト自動化+内部使用技術解説Friendlyで始めるwindowsアプリシステムテスト自動化+内部使用技術解説
Friendlyで始めるwindowsアプリシステムテスト自動化+内部使用技術解説
 
Ride on azure~アイデアソン編~
Ride on azure~アイデアソン編~Ride on azure~アイデアソン編~
Ride on azure~アイデアソン編~
 
私とC++ in 例外安全day
私とC++ in 例外安全day私とC++ in 例外安全day
私とC++ in 例外安全day
 
Friendlyを使ったwindowsアプリテスト自動化
Friendlyを使ったwindowsアプリテスト自動化Friendlyを使ったwindowsアプリテスト自動化
Friendlyを使ったwindowsアプリテスト自動化
 

他言語との連携(ネイティブから動的言語まで)