在C#StringBuilder结构中导入C dll

在C#StringBuilder结构中导入C dll,c#,c,marshalling,stringbuilder,C#,C,Marshalling,Stringbuilder,我需要为C dll导入一个函数GDPI,我想在一个C#应用程序中使用。 我的问题是一个参数是一个struct CFSPI,在这个struct中我有其他struct: PII PPI LPPCC LPPOL LPPOP 我的问题是LPPOL的原始结构是C typedef struct tagCFS_PRINT_OVLINFO { DWORD dwOverlayType; TCHAR szFormPath[MAX_PATH]; DWORD dwFormID; BOOL bFormIdFixed; }

我需要为C dll导入一个函数GDPI,我想在一个C#应用程序中使用。 我的问题是一个参数是一个struct CFSPI,在这个struct中我有其他struct: PII PPI LPPCC LPPOL LPPOP

我的问题是LPPOL的原始结构是C

typedef struct tagCFS_PRINT_OVLINFO {
DWORD dwOverlayType;
TCHAR szFormPath[MAX_PATH];
DWORD dwFormID;
BOOL bFormIdFixed;
} CFS_PRINT_OVLINFO, *LPCFS_PRINT_OVLINFO;
CFSPI结构是:

typedef struct tagCFS_PRINTINFO {
DWORD wCopies;
DWORD dwPrintInterval;
DWORD dwPrintSpeed;
DWORD dwPageID;
DWORD dwJobID;
CFS_PRINT_IMGINFO pii;
CFS_PRINT_PAPERINFO ppi;
LPCFS_PRINT_CCORRECTINFO lppcc;
LPCFS_PRINT_OVLINFO lppol;
LPCFS_PRINT_OPTION lppop;
LPVOID lpReserve1;
LPVOID lpReserve2;
DWORD dwReserve1;
DWORD dwReserve2;
} CFS_PRINTINFO, *LPCFS_PRINTINFO;
函数定义是

int CFTGetDefaultPrintInfo(
IN LPTSTR lptPrinterName, // Printer name to obtain the print information
OUT CFSPI* lpPrtInfo // Default print information
);
我试着用C#by来定义

当我调用我拥有的函数时

Blockquote不可能删除champ’lppol’de type’App.CFS_PRINTINFO:处理信息后的类型定义,主要是管理类型/非管理类型与执法人员的非有效性组合

我尝试使用字符串,但没有成功

你有什么想法吗


谢谢

要创建固定缓冲区,您不需要使用
StringBuilder

internal unsafe struct CFS_PRINT_OVLINFO
{
    internal uint dwOverlayType; // Overlay, Print type
    internal fixed char szFormPath[MAX_PATH]; // Form file path
    internal uint dwFormID; // Form file ID
    internal bool bFormIdFixed; // Wether to fix the form ID
}
您必须启用不安全代码,才能使其正常工作

但是C代码与您在C中创建的代码之间存在更多的不兼容:
lppcc
lppol
lppop
都是指针,因此它们应该创建为指针,或者创建为
IntPtr

internal unsafe struct CFS_PRINTINFO
{
    internal uint dwCopies;
    internal uint dwPrintInterval;
    internal uint dwPrintSpeed;
    internal uint dwPageID;
    internal uint dwJobID;
    internal CFS_PRINT_IMGINFO pii;
    internal CFS_PRINT_PAPERINFO ppi;
    internal CFS_PRINT_CCORRECTINFO* lppcc;
    internal CFS_PRINT_OVLINFO* lppol;
    internal CFS_PRINT_OPTION* lppop; 
    internal IntPtr lpReserve1; 
    internal IntPtr lpReserve2;
    internal uint dwReserve1;
    internal uint dwReserve2;
}
甚至extern方法的定义也不正确,应该是(假设
CFSPI
CFS\u PRINTINFO
):


您是否尝试在StringBuilder上添加MarshalAs属性?只需使用MarshalAsAttribute并将该字段声明为Char[]szFormPath(如果是ASCII或UTF-8,则为Byte)。顺便说一句,我会将StructLayout或FieldOffset添加到您的结构中!当我更改内部StringBuilder szFormPath;//表单文件路径由[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]内部字符串szFormPath;//表单文件路径我还有一个问题,那就是PInvokeStackInBalance你知道我如何找到有问题的变量吗?非常感谢你,没有问题。
internal unsafe struct CFS_PRINTINFO
{
    internal uint dwCopies;
    internal uint dwPrintInterval;
    internal uint dwPrintSpeed;
    internal uint dwPageID;
    internal uint dwJobID;
    internal CFS_PRINT_IMGINFO pii;
    internal CFS_PRINT_PAPERINFO ppi;
    internal CFS_PRINT_CCORRECTINFO* lppcc;
    internal CFS_PRINT_OVLINFO* lppol;
    internal CFS_PRINT_OPTION* lppop; 
    internal IntPtr lpReserve1; 
    internal IntPtr lpReserve2;
    internal uint dwReserve1;
    internal uint dwReserve2;
}
[DllImport("mydll.dll")]
internal static extern int CFTGetDefaultPrintInfo(string lptPrinterName, out CFSPI lpPrtInfo);