C# 调用一个dll方法,但它说的是;是一个字段,但用作类型;

C# 调用一个dll方法,但它说的是;是一个字段,但用作类型;,c#,.net,C#,.net,我想使用kernel32.dll,需要为此创建我自己的dll。我已经创建了DllImp.cs代码,并希望在另一个文件(如pipe.cs)中使用这些方法,但我遇到了如下错误: CreateNamedPipe is a method but is used like a type. PipeName is a field but is used like a type PIPE_ACCESS_DUPLEX is a field but is used like a type PIPE_TYPE_ME

我想使用kernel32.dll,需要为此创建我自己的dll。我已经创建了DllImp.cs代码,并希望在另一个文件(如pipe.cs)中使用这些方法,但我遇到了如下错误:

CreateNamedPipe is a method but is used like a type.
PipeName is a field but is used like a type
PIPE_ACCESS_DUPLEX is a field but is used like a type
PIPE_TYPE_MESSAGE  is a field but is used like a type
我的代码是:

//DllImp.cs code
using System;
using System.Text;
using System.Security;
using System.Runtime.InteropServices;

namespace MessageManagerServer {
[SuppressUnmanagedCodeSecurity]
public sealed class DllImports {
           [DllImport("kernel32.dll")]
    public static extern IntPtr CreateNamedPipe(
        String lpName,                              // pipe name
        uint dwOpenMode,                            // pipe open mode
        uint dwPipeMode,                            // pipe-specific modes
        uint nMaxInstances,                         // maximum number of instances
        uint nOutBufferSize,                        // output buffer size
        uint nInBufferSize,                         // input buffer size
        uint nDefaultTimeOut,                       // time-out interval
        IntPtr pipeSecurityDescriptor);             // SD
  public const uint PIPE_ACCESS_DUPLEX       = 0x00000003;
    //public const uint PIPE_TYPE_BYTE           = 0x00000000;
    public const uint PIPE_TYPE_MESSAGE        = 0x00000004;
    //public const uint PIPE_READMODE_BYTE       = 0x00000000;
    public const uint PIPE_READMODE_MESSAGE    = 0x00000002;
    public const uint PIPE_WAIT                = 0x00000000;

    public const uint NMPWAIT_WAIT_FOREVER     = 0xffffffff;
    public const uint NMPWAIT_USE_DEFAULT_WAIT = 0x00000000;

    public const int  INVALID_HANDLE_VALUE     = -1;
    public const uint ERROR_IO_PENDING         = 997;
    public const uint PIPE_UNLIMITED_INSTANCES = 255;

    public DllImp() {
    }
}
下面是pipe.cs代码

using System;
using System.Text;
using System.Security;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Collections;
using System.Data;
using System.IO;
using System.Data.SqlClient;
using System.Xml;
using System.Windows.Forms;
using System.Diagnostics;

namespace ClassLibrary1
{
public class Pipe
{
    private string PipeName = "\\\\.\\pipe\\Honeywell";
    public IntPtr Handle;
    Handle = DllImp.CreateNamedPipe(PipeName,DllImp.PIPE_ACCESS_DUPLEX,
                               DllImp.PIPE_TYPE_MESSAGE     |         
                               DllImp.PIPE_READMODE_MESSAGE |         
                               DllImp.PIPE_WAIT,                      
                               1,                                        
                               0,                                         
                               0,                                        
                               1000,                                      
                               IntPtr.Zero);

}
}

您不能像这样初始化
句柄
字段,您试图在初始化期间访问一个实例字段,当您执行以下操作时:

 public IntPtr Handle;
 Handle = ...
这是不允许的,因为在初始化字段之前,您可能正在访问该字段

尝试一次完成所有工作:

public IntPtr Handle = DllImp.CreateNamedPipe(PipeName,DllImp.PIPE_ACCESS_DUPLEX,
                           DllImp.PIPE_TYPE_MESSAGE     |         
                           DllImp.PIPE_READMODE_MESSAGE |         
                           DllImp.PIPE_WAIT,                      
                           1,                                        
                           0,                                         
                           0,                                        
                           1000,                                      
                           IntPtr.Zero);
您还可以将初始化移动到类构造函数中,如Marcs answer中所示,后者更干净

public Pipe()
{
    Handle = ....
}
嗯,我:

  • 将所有
    DllImp
    更改为
    DllImports
    (因为这就是类的名称)
  • 句柄=
    代码移动到构造函数中(也可以使用字段初始值设定项,但这似乎保留了代码的意图)
它编译得很好

public Pipe()
{
    Handle = DllImports.CreateNamedPipe(PipeName,
                       DllImports.PIPE_ACCESS_DUPLEX,
                       DllImports.PIPE_TYPE_MESSAGE |
                       DllImports.PIPE_READMODE_MESSAGE |
                       DllImports.PIPE_WAIT,
                       1,
                       0,
                       0,
                       1000,
                       IntPtr.Zero);
}
(还将
DllImports
中的构造函数重命名为
DllImports


完整代码:

那么什么是
DllImp
的实现?应该是
DllImports.PIPE\u ACCESS\u DUPLEX
等吗?DllImp.cs的代码是否编译?