C# - 从动态库 dll 调用函数

新泽西州

我必须使用 C# 访问动态库。使用 COM 库时效果很好,但是当我尝试使用动态库时,它会导致错误。

第一个问题

起初我做我的代码是这样的:

[DllImport("mydll.dll")]
public static extern int toGetInfo(uint id, char[] strVolume, char[] strInfo);
// strVolume and strInfo is parameter that return value with [out]

public static void Main()
{
char[] test1,test2;
toGetInfo(0,test1,test2);
}

但它无法编译错误使用未分配的局部变量 test1 和 test2 。然后,我通过添加编辑我的代码出来是这样的:

[DllImport("mydll.dll")]
public static extern int toGetInfo(uint id, out char[] strVolume, out char[] strInfo);
// strVolume and strInfo is parameter that return [out]

public static void Main()
{
char[] test1,test2;
toGetInfo(0, out test1, out test2);
}

它能够编译但向 test1 和 test2 返回空值。

第二个问题

[DllImport("mydll.dll")]
public static extern int toOpen(uint id, char* name);

 public static void Main()
{
 char name;
 toOpen(0, name);
}

编译时出现错误“指针和固定大小的缓冲区只能在不安全的上下文中使用”

知道怎么做吗?

杰德翁

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;


namespace ConsoleApplication74
{
    class Program
    {
        [DllImport("mydll.dll")]
        public static extern int toGetInfo(uint id, IntPtr strVolume, IntPtr strInfo);

        [DllImport("mydll.dll")]
        public static extern int toOpen(uint id, IntPtr name);

        const int STRING_LENGTH = 256;
        static void Main(string[] args)
        {

            IntPtr strVolumePtr = Marshal.AllocHGlobal(STRING_LENGTH);
            IntPtr strInfoPtr = Marshal.AllocHGlobal(STRING_LENGTH);

            uint id = 123;

            int status1 = toGetInfo(id, strVolumePtr, strInfoPtr);

            string strVolume = Marshal.PtrToStringAnsi(strVolumePtr);
            string strInfo = Marshal.PtrToStringAnsi(strInfoPtr);

            string name = "John";
            IntPtr openNamePtr = Marshal.StringToHGlobalAnsi(name);
            int status2 = toOpen(id, openNamePtr);

            Marshal.FreeHGlobal(strVolumePtr);
            Marshal.FreeHGlobal(strInfoPtr);
            Marshal.FreeHGlobal(openNamePtr);

        }

    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章