VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: zero9999

请问高手,可以把C语言嵌入到C#中吗

[复制链接]

0

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-2-22 14:30:01 | 显示全部楼层
// fastcopy.cs
// compile with: /unsafe
using System;

class Test
{
    // The unsafe keyword allows pointers to be used within
    // the following method:
    static unsafe void Copy(byte[] src, int srcIndex,
        byte[] dst, int dstIndex, int count)
    {
        if (src == null || srcIndex < 0 ||
            dst == null || dstIndex < 0 || count < 0)
        {
            throw new ArgumentException();
        }
        int srcLen = src.Length;
        int dstLen = dst.Length;
        if (srcLen - srcIndex < count ||
            dstLen - dstIndex < count)
        {
            throw new ArgumentException();
        }


            // The following fixed statement pins the location of
            // the src and dst objects in memory so that they will
            // not be moved by garbage collection.         
            fixed (byte* pSrc = src, pDst = dst)
            {
                  byte* ps = pSrc;
                  byte* pd = pDst;

            // Loop over the count in blocks of 4 bytes, copying an
            // integer (4 bytes) at a time:
            for (int n =0 ; n < count/4 ; n++)
            {
                *((int*)pd) = *((int*)ps);
                pd += 4;
                ps += 4;
            }

            // Complete the copy by moving any bytes that weren't
            // moved in blocks of 4:
            for (int n =0; n < count%4; n++)
            {
                *pd = *ps;
                pd++;
                ps++;
            }
            }
    }


    static void Main(string[] args)
    {
        byte[] a = new byte[100];
        byte[] b = new byte[100];
        for(int i=0; i<100; ++i)
           a[i] = (byte)i;
        Copy(a, 0, b, 0, 100);
        Console.WriteLine("The first 10 elements are:");
        for(int i=0; i<10; ++i)
           Console.Write(b[i] + " ");
        Console.WriteLine("\n");
    }
}

看看这个exp吧  unsafe
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-23 17:15:01 | 显示全部楼层
使用unsafe编程,如下例
   public unsafe class Dog
    {

        public uint DogBytes, DogAddr;
        public byte[] DogData;
        public uint Retcode;
        
        
        [DllImport("Win32dllRead.dll", CharSet = CharSet.Ansi)]
        public static unsafe extern uint DogRead(uint idogBytes, uint idogAddr, byte* pdogData);
        [DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]
        public static unsafe extern uint DogWrite(uint idogBytes, uint idogAddr, byte* pdogData);

        public unsafe Dog(ushort num)
        {
            DogBytes = num;
            DogData = new byte[DogBytes];
        }
public unsafe void ReadDog()
        {
            fixed (byte* pDogData = &DogData[0])
            {
                Retcode = DogRead(DogBytes, DogAddr, pDogData);
            }
        }
}
回复

使用道具 举报

0

主题

110

帖子

63.00

积分

新手上路

Rank: 1

积分
63.00
发表于 2020-2-24 09:45:01 | 显示全部楼层
try..

unsafe
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-29 18:30:01 | 显示全部楼层
unsafe
回复

使用道具 举报

0

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-3-2 21:00:02 | 显示全部楼层
msdn unsafe~
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-3-3 08:45:01 | 显示全部楼层
上面的好像都是都用到了dllimport,
呵呵,我是要使用头文件。。。
回复

使用道具 举报

0

主题

31

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-3-6 15:30:02 | 显示全部楼层
封成DLL
回复

使用道具 举报

0

主题

31

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-3-6 15:45:01 | 显示全部楼层
PS:封成DLL只要有入口参数就不用dllimport
用regsvr32注册一下就ok了
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-3-6 21:45:01 | 显示全部楼层
头文件能封成dll? 不太会
回复

使用道具 举报

1

主题

31

帖子

22.00

积分

新手上路

Rank: 1

积分
22.00
发表于 2020-3-6 23:45:01 | 显示全部楼层
C#里是可以嵌入非安全代码的,就是unsafe编程,如果有unsafe编程则要在编译器上加上unsafe的选项.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表