{"id":33,"date":"2008-01-21T22:13:28","date_gmt":"2008-01-22T02:13:28","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=33"},"modified":"2008-01-29T14:14:49","modified_gmt":"2008-01-29T18:14:49","slug":"call-a-function-in-an-unmanaged-dll-from-c","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=33","title":{"rendered":"Call into Unmanaged dlls from C#"},"content":{"rendered":"<p>Overview\u00a0<\/p>\n<ul>\n<li>PInvoke is used to invoke\u00a0unmanaged dlls\n<ul>\n<li>kernel32.dll\n<ul>\n<li>process loading<\/li>\n<li>context switching<\/li>\n<li>file, memory i\/o<\/li>\n<\/ul>\n<\/li>\n<li>user32.dll\n<ul>\n<li>windows, menus, dialog boxes, icons, etc.<\/li>\n<\/ul>\n<\/li>\n<li>GDI32\n<ul>\n<li>drawing capabilities<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Declare a method in c# to access unmanaged function<\/p>\n<ul>\n<li>Declare this method as both\n<ul>\n<li>static<\/li>\n<li>extern<\/li>\n<\/ul>\n<\/li>\n<li>Apply attribute System.Runtime.InteropServices.DllImportAttribute to specify\n<ul>\n<li>dll file<\/li>\n<li>name of the unmanaged function<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>Examples\n<ul><code lang=\"csharp\"><br \/>\n[DllImport(\"kernel32.dll\", EntryPoint=\"GetPrivateProfileString\")]<br \/>\nprivate static extern int GetPrivateProfileString(string lpAppName,<br \/>\nstring lpKeyName, string lpDefault, StringBuilder lpReturnedString,<br \/>\nint nSize, string lpFileName);<br \/>\n<\/code><\/ul>\n<ul><code lang=\"csharp\"><br \/>\n[DllImport(\"kernel32.dll\", EntryPoint=\"WritePrivateProfileString\")]<br \/>\nprivate static extern bool WritePrivateProfileString(string lpAppName,<br \/>\nstring lpKeyName, string lpString, string lpFileName);<\/code><\/ul>\n<\/li>\n<\/ul>\n<p>Call unmanaged\u00a0function that uses callbacks<\/p>\n<ul>\n<li>Declare a delegate with the required signature for the callback<\/li>\n<li>Define call back function to be passed<\/li>\n<li>Pass the callback to the function<\/li>\n<li>Example<br \/>\n<code lang=\"csharp\"><br \/>\n\/\/ The signature for the callback method.<br \/>\npublic delegate void OnXMConnect();<br \/>\npublic delegate void OnXMDisconnect();<br \/>\n\/\/ The call back methods<br \/>\nprivate static void OnXMConn(){<br \/>\nConsole.WriteLine(\"Connected\");<br \/>\n}<br \/>\nprivate static void OnXMDisconn(){<br \/>\nConsole.WriteLine(\"DisConnected\");<br \/>\n}\/\/ Pass the callbacks to unmanaged function<br \/>\nprivate static void TestXM(){<br \/>\nUSB_RegisterCallbacks(OnXMConn, OnXMDisconn);<br \/>\n}<\/code><\/li>\n<\/ul>\n<p>Pass Struct as parameter<\/p>\n<ul>\n<li>Define a class to represent C struct<\/li>\n<li>Annotate with [StructLayout(LayoutKind.Sequential)]<\/li>\n<li>Declare struct members as class member variables<\/li>\n<li>Annotate variables with [MarshalAs&#8230;] if needed<\/li>\n<li>Example<br \/>\n<code lang=\"csharp\"><br \/>\n\/\/ Define struct as a class<br \/>\n[StructLayout(LayoutKind.Sequential)]<br \/>\npublic class OSVersionInfo<br \/>\n{<br \/>\npublic int dwOSVersionInfoSize;<br \/>\npublic int dwMajorVersion;<br \/>\npublic int dwMinorVersion;<br \/>\npublic int dwBuildNumber;<br \/>\npublic int dwPlatformId;<br \/>\n[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]<br \/>\npublic string szCSDVersion;<br \/>\n}\/\/ Use the class<br \/>\n[DllImport(\"kernel32.dll\")]<br \/>\npublic static extern bool GetVersionEx([In, Out] OSVersionInfo osvi);private static void TestStruct()<br \/>\n{<br \/>\nOSVersionInfo osvi = new OSVersionInfo();<br \/>\nosvi.dwOSVersionInfoSize = Marshal.SizeOf(osvi);GetVersionEx(osvi);<\/p>\n<p>Console.WriteLine(\"Major version: {0}\", osvi.dwMajorVersion);<br \/>\nConsole.WriteLine(\"Minor version: {0}\", osvi.dwMinorVersion);<br \/>\n}<\/p>\n<p><\/code><\/li>\n<\/ul>\n<p>\/\/ if RECT is a class, not struct<br \/>\n<code lang=\"csharp\"><br \/>\n[DllImport(\"user32.dll\")]<br \/>\npublic static extern int GetWindowRect(int hwnd, [MarshalAs(UnmanagedType.LPStruct)] RECT rc);<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview\u00a0 PInvoke is used to invoke\u00a0unmanaged dlls kernel32.dll process loading context switching file, memory i\/o user32.dll windows, menus, dialog boxes, icons, etc. GDI32 drawing capabilities Declare a method in c# to access unmanaged function Declare this method as both static &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=33\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[5],"tags":[],"class_list":["post-33","post","type-post","status-publish","format-standard","hentry","category-c"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8cRUO-x","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=33"}],"version-history":[{"count":0,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/33\/revisions"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=33"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=33"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}