C# 调用一个dll方法,但它说的是;是一个字段,但用作类型;
我想使用kernel32.dll,需要为此创建我自己的dll。我已经创建了DllImp.cs代码,并希望在另一个文件(如pipe.cs)中使用这些方法,但我遇到了如下错误: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
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的代码是否编译?