首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DllImport C Sharp const char*

DllImport C Sharp const char*
EN

Stack Overflow用户
提问于 2017-06-08 15:06:22
回答 2查看 1.7K关注 0票数 0

大家好,

我想在C#中从非托管dll变成托管dll。

在文件中,它是:

代码语言:javascript
复制
typedef void*    AP_HANDLE
typedef uint32_t ap_u32

AP_HANDLE ap_CreateVirtual(const char *szFilename)

void ap_SetState(AP_HANDLE apbase, const char *szState, int nValue)

unsigned char *ap_ColorPipe(AP_HANDLE      apbase, 
                            unsigned char *pInBuffer,
                            ap_u32         nInBufferSize, 
                            ap_u32        *rgbWidth, 
                            ap_u32        *rgbHeight, 
                            ap_u32        *rgbBitDepth)

在C++中工作正常,但在C#中语法是个问题,我似乎不能让evan成为第一个函数

代码语言:javascript
复制
public unsafe class appbase
{
    [DllImport("D:\\apbase.dll", EntryPoint = "ap_CreateVirtual")]
    //, CharSet = UnicodeEncoding
    //, CallingConvention = CallingConvention.StdCall

    public static extern void* ap_CreateVirtual(char* szFilename);
}

代码语言:javascript
复制
    public static void Main()
    {
        unsafe
        {
            void* ap_handle = null;

            appbase APPbase = new appbase();

            string s = "D:\\ASX.xsdat";

            fixed (char* p = s)
            {
                ap_handle = APPbase.ap_CreateVirtual(p);
            }

            return;
        }
    }

尝试使用ap_CreateVirtual字符串、字符串*、char*、char[]的参数并在返回时放置一个断点;ap_handle的值总是为0x0000

导入这些函数的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-08 15:16:04

char*是.NET字符串的默认封送处理。

代码语言:javascript
复制
[DllImport("D:\\apbase.dll", EntryPoint = "ap_CreateVirtual", CharSet = CharSet.Ansi)]
//, CallingConvention = CallingConvention.StdCall
public static extern System.IntPtr ap_CreateVirtual(string szFilename);

您最初的尝试是错误的,因为char in C#是C++的wchar_t,而不是C++ char

如果你需要一个C++ char in C#,它要么是byte,要么是sbyte。但是p/invoke只会对System.String做正确的事情。

票数 2
EN

Stack Overflow用户

发布于 2017-06-08 15:18:28

仅仅复制C++头是不够的。您需要了解这些参数的实际含义以及它们是如何表示的。第一个函数非常简单:

代码语言:javascript
复制
[DllImport("...", EntryPoint="ap_CreateVirtual")]
public static extern IntPtr ap_CreateVirtual(
  [In, MarshalAs(UnmanagedType.LPStr)] string szFilename);

我假设在第二个阶段,szState又是一个简单的LPStr,而pInBuffer很可能是一个固定长度的byte[],大小由nInBufferSize决定。rgbXXX似乎是ref参数。返回类型可能再次是LPStr。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44439402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档