`
king_c
  • 浏览: 222663 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MarshalAs

    博客分类:
  • c#
 
阅读更多

 MarshalAs是提供向非托管代码封送数据时的规则。比如String或StringBuilder型,传递给非托管代码的时候可能是LPStr LPWStr BStr等等。你通过MarshalAs特性告诉.NET应该封送成什么类型。


Marshal就是把一个结构(类)序列化成一段内存,然后送到另一个进程(.net中Application domain)中供另一个进程中的函数使用。   
  比如你的一个结构struct{   
  Pen pen;   
  }s; s是一个指向已有的Pen对象的引用,当你把s传给本进程中的一个函数f时,f可以很容易地找到pen的实际对象,但如果你把s传到另外一个进程时,甚至是另外一台机器上的进程时,这个进程就没办法找到pen的实际内容。Marshal技术则可以把pen对象中的所有实际内容按规则放到一个缓冲中,(所有的引用或指针都要转换成实际对象)然后把缓冲中的内容送到另一个进程,函数调用完成再用同样方式把结果返回来。   
  在RPC,Interop,COM中Marshal应用很多。

分享到:
评论

相关推荐

    C#调用C++的dll实例,回调函数,string和int数组参数传递

    我们可以使用`MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I4)`来实现。 ```csharp [DllImport("YourDllName.dll")] public static extern void PassIntArray(int[] arr, int len); ``` 6. **...

    C# 实现在规定的时间内没有做任何操作,系统就注销

    [MarshalAs(UnmanagedType.U4)] public int cbSize; [MarshalAs(UnmanagedType.U4)] public uint dwTime; } ``` 此结构体用于获取最后一次输入的信息。 3. **调用GetLastInputInfo函数**: ```csharp ...

    C#获取打印机状态+API函数详细讲解.docx

    [MarshalAs(UnmanagedType.LPTStr)] public string pPrinterName; [MarshalAs(UnmanagedType.LPTStr)] public string pShareName; [MarshalAs(UnmanagedType.LPTStr)] public string pPortName; [MarshalAs...

    CSharp如何调用dll中带指针参数剖析.pdf

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public Int32[] number; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public char[] buffer; // 嵌套结构体指针 [MarshalAs...

    c#GetVideo

    public static extern bool capGetDriverDescriptionA(short wDriver, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszName, int cbName, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszVer, int ...

    C#调用C/C++ Dll中函数实例代码

    public static extern string MyFunction([MarshalAs(UnmanagedType.LPWStr)] string input); } ``` 这里的`DllImport`特性告诉.NET加载`MyDll.dll`并查找`MyFunction`函数。`CharSet`属性设置为`CharSet.Unicode`...

    c#调c++dll参数转换 (2).docx

    - `unsigned char *` 可以用 `[MarshalAs(UnmanagedType.LPArray)] byte[]` 或 `[MarshalAs(UnmanagedType.LPArray)] IntPtr` 在C#中表示,根据是否需要操作内存来选择。 - 指针类型的变量,如 `int *` 或 `double...

    C# 与 C++ 数据类型比较及结构体转换

    | `unsigned char *` | `[MarshalAs(UnmanagedType.LPArray)] byte[]` / `IntPtr` | 用于数组指针转换,使用`MarshalAs`指定属性以匹配C++数组 | | `char *` | `string` | 用于字符串指针转换 | | `void *` | `...

    c#对计算机的操作(控制面板等调用)API

    [return: MarshalAs(UnmanagedType.Bool)] [DllImport("shell32.dll", SetLastError = true)] private static extern bool ShellExecuteEx(ref SHELLEXECUTEINFO lpExecInfo); [StructLayout(LayoutKind.Sequential...

    cs调用dll时char指针及结构参数的用法.rar_C# dll 参数_DLL 指针_dll_dll ch

    public static extern void MyFunction([MarshalAs(UnmanagedType.LPStr)] string param); ``` 这里的`DllImport`告诉编译器这个方法是外部定义的,`UnmanagedType.LPStr`表示字符串是按零终止的char数组,即C风格...

    用c#写 自动关机程序

    [MarshalAs(UnmanagedType.Bool)] bool bRebootAfterShutdown, [MarshalAs(UnmanagedType.Bool)] bool bForceAppsClosed); private static void ShutdownCallback(IntPtr context, UInt32 timerId, UInt32 low...

    CSharp如何调用dll中带指针参数.pdf

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public Int32[] number; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public char[] buffer; } [DllImport("xxx.dll")] public static ...

    C#启动系统控制面板程序源代码

    [MarshalAs(UnmanagedType.LPTStr)] public string lpVerb; [MarshalAs(UnmanagedType.LPTStr)] public string lpFile; [MarshalAs(UnmanagedType.LPTStr)] public string lpParameters; [MarshalAs...

    C#启动外部程序的几种方法.rar_littlewoo_启动外部程序

    [MarshalAs(UnmanagedType.LPTStr)] public string lpVerb; [MarshalAs(UnmanagedType.LPTStr)] public string lpFile; [MarshalAs(UnmanagedType.LPTStr)] public string lpParameters; [MarshalAs...

    c#调用技巧 本文讨论了C#调用DLL的方式。

    5. **StructLayout** 和 **MarshalAs**:这两个特性分别用于指定结构体布局和数据类型转换,对于调用包含复杂数据类型的DLL尤其重要。 #### 三、C#调用DLL示例分析 接下来,我们将通过一个具体的例子来详细解释C#...

    C#调用默认浏览器打开网页的几种方法

    [MarshalAs(UnmanagedType.LPTStr)] public string lpVerb; [MarshalAs(UnmanagedType.LPTStr)] public string lpFile; [MarshalAs(UnmanagedType.LPTStr)] public string lpParameters; [MarshalAs...

    C#打开选中的文件夹并指向选中的文件

    [MarshalAs(UnmanagedType.LPTStr)] public string lpVerb; [MarshalAs(UnmanagedType.LPTStr)] public string lpFile; [MarshalAs(UnmanagedType.LPTStr)] public string lpParameters; [MarshalAs...

    c#调用C++ 的DLL带有CALLback

    public static extern int ScannerInit([MarshalAs(UnmanagedType.FunctionPtr)] CallbackFunc1 pCallbackFunc1); ``` 这里通过`DllImport`属性指定DLL文件名和要调用的函数名称。`CharSet.Unicode`表示函数使用...

    C# 优雅的 APIHOOK 支持X86+X64源码

    public delegate Int32 MessageBoxW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] string lpText, [MarshalAs(UnmanagedType.LPWStr)] string lpCaption, UInt32 uType); public class MessageBoxHook : ...

    c# 编写com组件

    int IObjectSafety.GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions) { // 实现此处的逻辑 }...

Global site tag (gtag.js) - Google Analytics