LINUX DOTNET      Linux DotNET 中文社区

Linux .NET编程与应用技术之专业网站:www.linuxdot.net !     返回首页    
   
[楼主] Linux下给C#增加CopyMemory支持

1、编写C程序,用string.h里面的memcpy函数实现CopyMemory

将下面代码保存为 kernel32.c

C++代码
#include<stdio.h>   
#include<string.h>   
   
void CopyMemory(void * src,void * dest,int size)
{
    memcpy(dest,src,size);
}
   
int TestAdd(int a,int b)
{
    return a+b;
}
   
int TestMin(int a,int b)
{
    return a-b;
}
int TestMul(int a,int b)
{
    return a*b;
}

2、编译成so文件
gcc -Wall -fPIC -c -O2 -o kernel32.o kernel32.c
gcc -shared -Wl,-soname,kernel32.so -o kernel32.so kernel32.o

3、在C#里面应用

将下面代码保存为Test.cs

C#代码
using System;
using System.Runtime.InteropServices;
   
namespace eGlic.Test
{
    public class TestSO
    {   
        [DllImport("kernel32.so",EntryPoint="TestAdd")]
        public static extern int TestAdd(int a,int b);
        [DllImport("kernel32.so",EntryPoint="TestMin")]
        public static extern int TestMin(int a,int b);
        [DllImport("kernel32.so",EntryPoint="TestMul")]
        public static extern int TestMul(int a,int b);
        [DllImport("kernel32.so",EntryPoint="CopyMemory")]
        public static extern void CopyMemory(System.IntPtr a,System.IntPtr b,int c);
           
        public unsafe static void Main()
        {
            int a=4; 
            int b=6; 
            int x=0;
            x=TestAdd(a,b);
            System.Console.WriteLine("TestAdd(4,6) ="+x.ToString());
        
            x=TestMin(a,b);
            System.Console.WriteLine("TestMin(4,6) ="+x.ToString());
        
            x=TestMul(a,b);
            System.Console.WriteLine("TestMul(4,6) ="+x.ToString());

            byte [] d=new byte[4];   
            a=0x12345678;   

            System.Console.WriteLine("Test CopyMemory......");
            System.Console.WriteLine(" >Before CopyMemory: a= 0x"+a.ToString("x"));
            System.Console.WriteLine(" >Before CopyMemory: d[]= "+d[0].ToString("x")+" "+d[1].ToString("x")+" "+d[2].ToString("x")+" "+d[3].ToString("x")+" ");

            IntPtr ax;
            IntPtr dx; 
            int* ap=&a;
            fixed(byte* dp=&d[0])
            {
                ax=(IntPtr)ap;   
                dx=(IntPtr)dp;   
                CopyMemory(ax,dx,4);   
            }
            System.Console.WriteLine("  >After CopyMemory: a= 0x"+a.ToString("x"));
            System.Console.WriteLine("  >After CopyMemory: d[]= "+d[0].ToString("x")+" "+d[1].ToString("x")+" "+d[2].ToString("x")+" "+d[3].ToString("x")+" ");
        }
    }
}

4、编译测试
    mcs -unsafe Test.cs
    mono Test.exe

结果如下:

TestAdd(4,6) =10   
TestMin(4,6) =-2   
TestMul(4,6) =24   
Test CopyMemory......   
 >Before CopyMemory: a= 0x12345678   
 >Before CopyMemory: d[]= 0 0 0 0    
 >After CopyMemory: a= 0x12345678   
 >After CopyMemory: d[]= 78 56 34 12    

作者:mononet   发布时间:08年01月25日   可选操作:删除 回复

 
   
   

留言回复:
标题: * 标题必填
作者:   * 请填上你的名字  
操作键:   * 填入几个字母表示是您写的,便于进一步操作
发言内容:
 
发贴者须知:
1、您无需注册即可发贴,但是,贴子内容必须在法律法规和社会公德所允许的范围内;
2、本站专注IT技术,谢绝包括政治、社会、情感等任何与IT技术无关的贴子在本站发表;
3、本站保留对任何贴子进行删除、禁用、更改、举报、追究等所有权利;
 
今天是: 星期三  星期一  星期二  星期天  星期四  星期五  星期六