我得到了一个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