使用本机Windows API制作C#库

使用本机Windows API制作C#库,c#,dll,dllimport,C#,Dll,Dllimport,我正在构建C#library(.dll),其中一些类使用本机Windows API函数。具体来说,函数GetPrivateProfileString和WritePrivateProfileString,如: static class NativeMethods { // external functions for working with ini files [DllImport("kernel32.DLL", EntryPoint = "GetPrivateProfileSt

我正在构建C#library(.dll),其中一些类使用本机Windows API函数。具体来说,函数
GetPrivateProfileString
WritePrivateProfileString
,如:

static class NativeMethods
{
    // external functions for working with ini files
    [DllImport("kernel32.DLL", EntryPoint = "GetPrivateProfileStringW",
      SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true,
      CallingConvention = CallingConvention.StdCall)]
    public static extern int GetPrivateProfileString(string lpAppName, string lpKeyName,
      string lpDefault,
      string lpReturnString,
      int nSize,
      string lpFilename);

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern bool WritePrivateProfileString(string lpAppName,
                                                        string lpKeyName,
                                                        string lpString,
                                                        string lpFileName);
}
并使用它们:

NativeMethods.GetPrivateProfileString(section, key, "", result, 127, this.path);
NativeMethods.WritePrivateProfileString(section, key, " " + value, this.path);

当我在另一个项目中直接使用这个类时(没有从dll中使用它),它可以正常工作。但当我把它构建到dll中,然后在另一个项目中引用这个dll时,这些函数就不起作用了。他们什么也不做。

你对
GetPrivateProfileString
的pinvoke是错误的,正如马修所说。将字符串数据传递回调用方时,需要使用
StringBuilder

您没有检查错误。因此,在你不知道的情况下,这些函数出现故障是完全合理的

为了了解您的呼叫失败的原因,您首先需要解决这些问题。然后您可以查看返回值。了解您正在使用的参数值也会有所帮助。但目前只有你有能力做到这一点

更大的问题是,您根本不需要调用这些函数。报告说:

此功能仅用于与基于Windows的16位应用程序兼容


这些功能包含许多兼容性垫片,使使用它们成为一个完整的雷区。不要去那里。找到一个合适的第三方原生C~ini文件类,并假装从未听说过
GetPrivateProfileString
WritePrivateProfileString

哦,我发现了错误。我强制在当前目录中查找ini文件路径(在我的DLL类代码中)。当我从DLL中调用它时,它会自动在C:\Windows中查找文件。使用
Directory.GetCurrentDirectory()+iniFile
后,它可以正常工作。

我有这样的代码,但它可以正常工作。然而,我可以看到的一个区别是,我使用
StringBuilder
GetPrivateProfileString
返回结果。我不认为这会有什么不同,虽然<代码>静态外部int GetPrivateProfileString(字符串部分、字符串键、字符串默认值、StringBuilder结果、int大小、字符串文件名)您是否尝试调试代码以查看是否返回了错误?它不应该有这样的效果。正如我所说,如果我在项目中直接使用了它,那么这段代码可以正常工作。但从引用dll库中使用它时没有。@Matthew:不幸的是,没有错误。它遍历方法调用,但方法不执行任何操作。它是否返回
0
?如果是这样,您是否调用了
Marshal.GetLastWin32Error()
以查看错误是什么?我已修改为使用StringBuilder,现在正在检查返回值。再次处理方法,返回值为0。或者我可以在运行DLLImported方法时检查错误吗?对于这两个函数,返回值0表示失败。如文档中所述。你已经详细阅读了文档了吗?事实上,我劝你不要费心去做那件事。请停止使用它们。正如MS所指示的那样。@Majak返回值是
复制到缓冲区的字符数,不包括终止的空字符。
我找到了解决方案。谢谢你们的建议,伙计们。我将尝试找到一些高质量的第三方INI解析器库。使用
Path。合并
以加入路径。