Recommended
PPTX
Windowsアプリテスト自動化 [Friendly+delphi]
PPTX
PDF
初歩から始めるJava勉強会 プレゼンテーション資料
PDF
PPTX
PPTX
Visual Studio Code でプログラムをデバッグしよう!
PPTX
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
PPTX
ODP
PDF
「Delphiのマイグレーションを行うのであれば、これだけは知っておこう!」
PPTX
KEY
PPTX
PPTX
【schoo WEB-campus】#44 エンジニアのマネジメント 先生:伊勢幸一
PDF
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PDF
あるゲームアプリケーションの構成とアップデートサイクル
PDF
PDF
PDF
「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」
PPTX
ODP
PDF
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
PPTX
PDF
PDF
PDF
PDF
ユーザーショーケース「C++Builderを用いたマルチOS対応一般コンシューマ向けスマートフォンアプリ開発事例」
PDF
PPTX
burikaigi2025.pptx Burikaigi2025でつかった資料です。
PPTX
DotNetConf2024の資料 BlazorとLowCodeと生成AIの話です
More Related Content
PPTX
Windowsアプリテスト自動化 [Friendly+delphi]
PPTX
PDF
初歩から始めるJava勉強会 プレゼンテーション資料
PDF
PPTX
PPTX
Visual Studio Code でプログラムをデバッグしよう!
PPTX
Developers Summit 2014 【13-D-7】 コミュニティLT - Story 5. 「新人技術者にどうプログラミングを教えたか」
PPTX
What's hot
ODP
PDF
「Delphiのマイグレーションを行うのであれば、これだけは知っておこう!」
PPTX
KEY
PPTX
PPTX
【schoo WEB-campus】#44 エンジニアのマネジメント 先生:伊勢幸一
PDF
PHPでもモダンでスケーラブルな開発を DevLOVE現場甲子園2013発表資料
PDF
あるゲームアプリケーションの構成とアップデートサイクル
PDF
PDF
PDF
「RAD Studio XE5によるマルチ言語/マルチデバイス開発の進め方」
PPTX
ODP
PDF
4 Colors Othello’s Algorithm @仙台 IT 文化祭 2017
PPTX
PDF
PDF
PDF
PDF
ユーザーショーケース「C++Builderを用いたマルチOS対応一般コンシューマ向けスマートフォンアプリ開発事例」
PDF
More from Tatsuya Ishikawa
PPTX
burikaigi2025.pptx Burikaigi2025でつかった資料です。
PPTX
DotNetConf2024の資料 BlazorとLowCodeと生成AIの話です
PDF
2024/07/04 Blazor+ローコードで実現する.NET資産のモダナイズ
PPTX
PPTX
【オンライン】.NET 6 移行祭り! C# Tokyo イベント
PPTX
PPTX
PPTX
Test automation strategy for .net core 3 transition
PDF
PPTX
Infragistics Web Day 2017 - 継続的な開発を支える テスト自動化技術
PPTX
PPTX
メタな感じのプログラミング(プロ生 + わんくま 071118)
PPTX
PPTX
PPTX
価値あるシステムテスト自動化の実現By friendly
PPTX
PPTX
Bindingからframework elementを見つける
PPTX
PPTX
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
PPTX
Friendlyで始めるwindowsアプリシステムテスト自動化+内部使用技術解説
他言語との連携(ネイティブから動的言語まで) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 初期化
ホスト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
19. オブジェクト生成
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
20. 21. 逆に.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;
}
}
22. 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;
}
}
23. [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);
}
24. 25. 26. 27. 28. 29. 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();
}
30. dynamicで表されるRubyのクラスの正体は?
class RubyObject : IRubyDynamicMetaObjectProvider
interface IRubyDynamicMetaObjectProvider : IDynamicMetaObjectProvider
public interface IDynamicMetaObjectProvider
{
DynamicMetaObject GetMetaObject(Expression parameter);
}
IDynamicMetaObjectProviderを実装したクラスをdynamicに入れると、
メソッド、プロパティー、フィールド解決時にGetMetaObjectを呼び出
してくれる。
なので、RubyObjectクラスがRubyに特化した解決をしてくれる。
*注)通常はIDynamicMetaObjectProviderではなく、
DynamicObjectを継承して実装します。
31. 32. 33. 34. 35. 以前は・・・
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し
ました。
お客様に使ってもらっているのですが、サポートも減りました。
36.