Unmanagedとmanaged

480 views

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
480
On SlideShare
0
From Embeds
0
Number of Embeds
29
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Unmanagedとmanaged

  1. 1. unmanaged & managed レガシーな世界との扉 13年10月20日日曜日
  2. 2. managed? Dot Net Framework deleteしなくてもgavage correctionして くれる 13年10月20日日曜日
  3. 3. unmanaged? ざっくり2000年以前のWindows 自分で使ったメモリは自分で削除 メモリ直接みれるし強引な事もできる “unsafe”の一言でMSがdisってる 13年10月20日日曜日
  4. 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. 5. managedからunmanagedを呼ぶ方はあ まり意識いらないし、ぐぐればすぐサ ンプルが出る 13年10月20日日曜日
  6. 6. 逆は? unmanagedからmanagedの呼び出しは ぐぐっても出ない(出ても英語) だからとりあえず日本語の資料として 作ってみた 13年10月20日日曜日
  7. 7. ニーズあるの? 旧式のほにゃららフレームワークなア プリから呼び出すDLLとか・・・ 13年10月20日日曜日
  8. 8. 構成 unmanagedアプリ unmanaged DLL(場合による) managedでunsafeなDLL managedでsafeなClass 13年10月20日日曜日
  9. 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. 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. 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. 12. 注意 誰がnewしてdeleteするか曖昧にすると メモリリークしまくる 一般論なら上位アプリがバッファをnew してポインタ渡し 13年10月20日日曜日
  13. 13. あとがき 二時間で書いた内容だからミスしてて もおかしくない 13年10月20日日曜日

×