如何在C#中调用这样的结构/指向结构?

时间:2019-06-09 16:19:36

标签: c# struct pinvoke

我得到了一个DLL(非常旧),该DLL从某种“加密的”(或更确切地说是模糊的)数据文件中读取并从中提取一些值。我收到的所有内容都是这些结构和这些旧C ++ DLL中的一堆读取函数。这些是结构:

typedef struct InParamsStruct {
    char *SourceFile;   // Path to a data source
    int DataIndex;      // Index of data inside a data source
} InParams;

typedef struct OutDataStruct {
    int Data1;      
    int Data2;      
    int Data3;      
} *OutData;

请不要使用第二个typedef。如果我在C ++测试应用程序中使用此DLL,则它看起来像这样:

InParams inParams;

// here initialization of inParams

OutData outData = NULL;
outData = (OutData) malloc(sizeof(OutData));

// getting function handle from DLL here

retVal = GetData(inParams, outData);

// 1 = ok, 0 = error

在C ++测试应用程序中retVal为1,我在outData中得到一些有效数据 现在,我需要在C#中使用此DLL(因为我必须使用的所有其他DLL都来自.NET,加上应用程序应该是功能丰富的UX应用程序,等等,等等)。所以我这样做了:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    struct InParams
    {
        public string SourceFile;
        public int DataIndex;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct OutData
    {
        public int Data1;
        public int Data2;
        public int Data2;
    }

    [DllImport("DataReader.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int GetData(InParams inParams, ref OutData outData);

这不起作用。无论我在做什么,它总是返回0(错误)。这个DLL是如此详尽地编写,它没有提供任何其他有关错误原因的有效信息(可能是内部最简单的异常处理)。

我尝试将ref更改为out。尝试过的指针方法(IntPtr,具有完整的内存分配)。还尝试了不安全的代码。什么都没有。

最让我困惑的是C ++中的typedef-用于OutDataStruct。新类型实际上是指向结构的指针。在C#端是否需要特殊的东西?

我知道我可以用C ++编写包装器,但是现在我正尝试避免在包装器上制作包装器,因为这可能会影响性能。

感谢您的帮助。

Vojtek

0 个答案:

没有答案