• C#平台调用的步骤


    1、准备CLRInsideOut2008_01.exe程序

    2、将所有的C的函数、结构、常量的声明合并到一个文件中

    3、去掉所有的预编译指令、头文件导入声明

    4、去掉定义为函数的宏

    5、用上述的程序转换它,仔细查看第一个错误,修正它

    6、复制到C#类库中,整理一下

    7、明确函数导入的dll名称

    8、为函数添加调用约定

    9、为委托添加调用约定

    形式:[UnmagedFunctionPointer(CallingConvention.Cdecl)]

    10、以“Error”为关键字查找,解决一下

    11、平台调用以函数为中心,对无用的结构、委托、常量、枚举,可以删掉

    12、仔细过一遍,查找不合理的地方

    13、char*变为StringBuilder而不是IntPtr;

    BOOL变bool而不是int,增加[return:MarshalAs(UnmanagedType.Bool)];

    unsigned char*变IntPtr而不是string。

    14、重命名匿名成员

    15、结构体太复杂或太大的解决方案

    void F(ref A a)
    {
    
    }

    声明变为:

    void F(IntPtr a)
    {
    
    }

    如果指针只是取数据:

    var intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(A)));
    F(intPtr);
    var w = (A)Marshal.PtrToStructure(intPtr, typeof(A));

    如果指针只是送数据:

    var intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(A)));
    A aa;
    Marshal.StructureToPtr(aa, intPtr, true);
    F(intPtr);
  • 相关阅读:
    WinForm换行
    aspx获取页面间传送的值
    Response.BinaryWrite()方法输出二进制图像
    Jquery删除table的行和列
    WinForm DataGridView控件隔行变色
    IE中table的innerHTML无法赋值
    C#为IE添加可信任站点
    静态代码检查
    第三方开源小工具
    查看sql server 服务器内存使用情况
  • 原文地址:https://www.cnblogs.com/yao2yao4/p/3127599.html
Copyright © 2020-2023  润新知