Unmanagedとmanaged

  • 167 views
Uploaded on

 

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
167
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. unmanaged & managed レガシーな世界との扉 13年10月20日日曜日
  • 2. managed? Dot Net Framework deleteしなくてもgavage correctionして くれる 13年10月20日日曜日
  • 3. unmanaged? ざっくり2000年以前のWindows 自分で使ったメモリは自分で削除 メモリ直接みれるし強引な事もできる “unsafe”の一言でMSがdisってる 13年10月20日日曜日
  • 4. 相互に呼ぶの? managedからunmanaged Windows APIを呼ぶ [DllImport(“user32.dll”)] public static extern int EnumWindow(WNDENUMPROC lpEnumFunc, IntPtr lParam) System.Runtime.InteropServices と いうパッケージがmanageしてます 13年10月20日日曜日
  • 5. managedからunmanagedを呼ぶ方はあ まり意識いらないし、ぐぐればすぐサ ンプルが出る 13年10月20日日曜日
  • 6. 逆は? unmanagedからmanagedの呼び出しは ぐぐっても出ない(出ても英語) だからとりあえず日本語の資料として 作ってみた 13年10月20日日曜日
  • 7. ニーズあるの? 旧式のほにゃららフレームワークなア プリから呼び出すDLLとか・・・ 13年10月20日日曜日
  • 8. 構成 unmanagedアプリ unmanaged DLL(場合による) managedでunsafeなDLL managedでsafeなClass 13年10月20日日曜日
  • 9. unmanagedなDLL 上位アプリケーションに渡すEXPORTS を吐き出す *hogehoge.def LIBRARY hogehoge EXPORTS function_1 function_2 *hogehoge.cpp #include xxxx #import “fugafuga.tlb” no_namespace named_guids raw_interfaces_only namespace hogehoge { extern “C” __declspec(dllexport) int WINAPI function_1(char* arg) { CoCreateInstance((REFCLSID)CLSID_fugafuga, ..., (LPVOID*)&pLib); pLib->func1(arg, &ret); return ret; 13年10月20日日曜日
  • 10. managedでunsafeなDLL 入り口でunsafeな引数や戻り値を中継 DLLとしてのInterface namaspace fugalib { [ClassInterface(ClassInterfaceType.AutoDual)] public class Fugafuga { public unsafe int func1(byte* arg1) { String str1 = “”; try { MyUtil.convertCP932ToString(arg1, ref str1); ←こんなUtilないと死ぬ } catch { return ERROR_CODE; } return bodyClass.function1(str); 13年10月20日日曜日
  • 11. 補足 Util byte配列とStringの変換 public unsafe static void convCP932ToString(byte* inStr, ref String outStr) { Encoding ms932 = Encoding.GetEncoding(“shift_jis”); Encoding utf = Encoding.Unicode; // unmanaged byte[] から managed Byte[] にコピー Byte[] ms932bytes = new Byte[256]; while (inStr[c] != 0 && c < 256) { ms932bytes[c] = inStr[c]; } // Unicodeに変換してゴミ処理 Byte[] utfBytes = Encoding.Convert(ms932, utf, ms932bytes); String tmpStr = utf.GetString(utfBytes); outStr = tmpStr.TrimEnd(‘¥0’); return; } 13年10月20日日曜日
  • 12. 注意 誰がnewしてdeleteするか曖昧にすると メモリリークしまくる 一般論なら上位アプリがバッファをnew してポインタ渡し 13年10月20日日曜日
  • 13. あとがき 二時間で書いた内容だからミスしてて もおかしくない 13年10月20日日曜日