ubuntu 中 kernel32.dll 的等价物是啥?
Posted
技术标签:
【中文标题】ubuntu 中 kernel32.dll 的等价物是啥?【英文标题】:what is the equivalent of kernel32.dll in ubuntu?ubuntu 中 kernel32.dll 的等价物是什么? 【发布时间】:2017-12-19 07:09:20 【问题描述】:您好,我已经在 c3 和 cpp 中在 windows 环境中开发了示例应用程序。这个应用程序实现了这些程序之间的命名管道进行通信。我的 cpp 程序中有 [DllImport("kernel32.dll", SetLastError = true)]
命令。当我编译我的 c# 程序时,我得到以下错误。
Enter the message
Unhandled Exception: Unhandled Exception: System.DllNotFoundException: Unable to load DLL 'kernel32.dll': The specified module or one of its dependencies could not be found.
(Exception from HRESULT: 0x8007007E)
at consoleapp.NamedPipeServer.CreateNamedPipe(String pipeName, UInt32 dwOpenMode, UInt32 dwPipeMode, UInt32 nMaxInstances, UInt32 nOutBufferSize, UInt32 nInBufferSize, UInt32 nDefaultTimeOut, IntPtr lpSecurityAttributes)
at consoleapp.NamedPipeServer.ListenForClients() in /home/niranjan/consoleapp/NamedPipeServer.cs:line 66
at System.Threading.Thread.ThreadMain_ThreadStart()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)System.DllNotFoundException: Unable to load DLL 'kernel32.dll': The specified module or one of its dependencies could not be found.
(Exception from HRESULT: 0x8007007E)
at consoleapp.NamedPipeServer.CreateNamedPipe(String pipeName, UInt32 dwOpenMode, UInt32 dwPipeMode, UInt32 nMaxInstances, UInt32 nOutBufferSize, UInt32 nInBufferSize, UInt32 nDefaultTimeOut, IntPtr lpSecurityAttributes)
at consoleapp.NamedPipeServer.ListenForClients() in /home/niranjan/consoleapp/NamedPipeServer.cs:line 66
at System.Threading.Thread.ThreadMain_ThreadStart()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
下面是我的 c# 文件。我在 ubuntu 中创建了 .Net core(2.0) 控制台应用程序。 程序.cs
using System;
namespace consoleapp
class Program
static void Main(string[] args)
Console.WriteLine("Hello World!");
NamedPipeServer PServer1 = new NamedPipeServer(@"\\.\pipe\myNamedPipe1",0);
NamedPipeServer PServer2 = new NamedPipeServer(@"\\.\pipe\myNamedPipe2",1);
PServer1.Start();
PServer2.Start();
string Ms="Start";
do
Console.WriteLine("Enter the message");
Ms = Console.ReadLine();
PServer2.SendMessage(Ms, PServer2.clientse);
while (Ms != "quit");
PServer1.StopServer();
PServer2.StopServer();
下面是我的 NamedPipeServer.cs
using System;
using Microsoft.Win32.SafeHandles;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
using System.IO;
namespace consoleapp
public class NamedPipeServer
[DllImport("kernel32.dll", SetLastError = true)]
public static extern SafeFileHandle CreateNamedPipe(
String pipeName,
uint dwOpenMode,
uint dwPipeMode,
uint nMaxInstances,
uint nOutBufferSize,
uint nInBufferSize,
uint nDefaultTimeOut,
IntPtr lpSecurityAttributes);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int ConnectNamedPipe(
SafeFileHandle hNamedPipe,
IntPtr lpOverlapped);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int DisconnectNamedPipe(
SafeFileHandle hNamedPipe);
public const uint DUPLEX = (0x00000003);
public const uint FILE_FLAG_OVERLAPPED = (0x40000000);
public class Client
public SafeFileHandle handle;
public FileStream stream;
public const int BUFFER_SIZE = 100;
public Client clientse =null;
public string pipeName;
Thread listenThread;
SafeFileHandle clientHandle;
public int ClientType;
public NamedPipeServer(string PName,int Mode)
pipeName = PName;
ClientType = Mode;//0 Reading Pipe, 1 Writing Pipe
public void Start()
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
private void ListenForClients()
while (true)
clientHandle =CreateNamedPipe(this.pipeName,DUPLEX | FILE_FLAG_OVERLAPPED,0,255,BUFFER_SIZE,BUFFER_SIZE,0,IntPtr.Zero);
//could not create named pipe
if (clientHandle.IsInvalid)
return;
int success = ConnectNamedPipe(clientHandle, IntPtr.Zero);
//could not connect client
if (success == 0)
return;
clientse = new Client();
clientse.handle = clientHandle;
clientse.stream = new FileStream(clientse.handle, FileAccess.ReadWrite, BUFFER_SIZE, true);
if (ClientType == 0)
Thread readThread = new Thread(new ThreadStart(Read));
readThread.Start();
private void Read()
//Client client = (Client)clientObj;
//clientse.stream = new FileStream(clientse.handle, FileAccess.ReadWrite, BUFFER_SIZE, true);
byte[] buffer = null;
ASCIIEncoding encoder = new ASCIIEncoding();
while (true)
int bytesRead = 0;
try
buffer = new byte[BUFFER_SIZE];
bytesRead = clientse.stream.Read(buffer, 0, BUFFER_SIZE);
catch
//read error has occurred
break;
//client has disconnected
if (bytesRead == 0)
break;
//fire message received event
//if (this.MessageReceived != null)
// this.MessageReceived(clientse, encoder.GetString(buffer, 0, bytesRead));
int ReadLength = 0;
for (int i = 0; i < BUFFER_SIZE; i++)
if (buffer[i].ToString("x2") != "cc")
ReadLength++;
else
break;
if (ReadLength > 0)
byte[] Rc = new byte[ReadLength];
Buffer.BlockCopy(buffer, 0, Rc, 0, ReadLength);
Console.WriteLine("C# App: Received " + ReadLength +" Bytes: "+ encoder.GetString(Rc, 0, ReadLength));
buffer.Initialize();
//clean up resources
clientse.stream.Close();
clientse.handle.Close();
public void SendMessage(string message, Client client)
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] messageBuffer = encoder.GetBytes(message);
if (client.stream.CanWrite)
client.stream.Write(messageBuffer, 0, messageBuffer.Length);
client.stream.Flush();
public void StopServer()
//clean up resources
DisconnectNamedPipe(this.clientHandle);
this.listenThread.Abort();
下面是我的 cpp 程序。
#include <stdio.h>
#include <windows.h>
unsigned long __stdcall NET_RvThr(void * pParam) ;
DWORD WINAPI ThreadProc() ;
HANDLE hPipe1,hPipe2;
BOOL Finished;
int main(int argc, char *argv[])
//Pipe Init Data
char buf[100];
LPTSTR lpszPipename1 = TEXT("\\\\.\\pipe\\myNamedPipe1");
LPTSTR lpszPipename2 = TEXT("\\\\.\\pipe\\myNamedPipe2");
DWORD cbWritten;
DWORD dwBytesToWrite = (DWORD)strlen(buf);
//Thread Init Data
DWORD threadId;
HANDLE hThread = NULL;
BOOL Write_St=TRUE;
Finished=FALSE;
hPipe1=CreateFile(lpszPipename1, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
hPipe2=CreateFile(lpszPipename2, GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if ((hPipe1 == NULL || hPipe1 == INVALID_HANDLE_VALUE)||(hPipe2 == NULL || hPipe2 == INVALID_HANDLE_VALUE))
printf("Could not open the pipe - (error %d)\n",GetLastError());
else
hThread = CreateThread( NULL, 0, &NET_RvThr, NULL, 0, NULL);
do
printf ("Enter your message: ");
scanf ("%s",buf);
if (strcmp (buf,"quit") == 0)
Write_St=FALSE;
else
WriteFile(hPipe1, buf, dwBytesToWrite, &cbWritten, NULL);
memset(buf,0xCC,100);
while(Write_St);
CloseHandle(hPipe1);
CloseHandle(hPipe2);
Finished=TRUE;
getchar();
unsigned long __stdcall NET_RvThr(void * pParam)
BOOL fSuccess;
char chBuf[100];
DWORD dwBytesToWrite = (DWORD)strlen(chBuf);
DWORD cbRead;
int i;
while(1)
fSuccess =ReadFile( hPipe2,chBuf,dwBytesToWrite,&cbRead, NULL);
if(fSuccess)
printf("C++ App: Received %d Bytes : ",cbRead);
for(i=0;i<cbRead;i++)
printf("%c",chBuf[i]);
printf("\n");
if (! fSuccess && GetLastError() != ERROR_MORE_DATA)
printf("Can't Read\n");
if(Finished)
break;
我正在尝试找出 ubuntu 等效的 kernal32.dll。有人可以帮我解决这个问题吗?任何帮助将不胜感激。谢谢你。
【问题讨论】:
linux 中没有等价物。 AFAIK “我的 cpp 程序中的命令”是哪个? Cpp 还是 C#?为什么不使用 System.IO.Pipes? voices.canonical.com/tag/named%20pipes 谢谢。这是cpp程序。我将在此处发布 cpp 程序。 这里解释:***.com/questions/988483/… 我尝试使用 [DllImport("msvcrt.dll", SetLastError = true)] 但我得到了 msvcrt.dll System.DllNotFoundException: Unable to load DLL 'msvcrt.dll': The specified module or one的依赖项找不到错误。 【参考方案1】:Ubuntu中的kernel32.dll等价物是什么?
Kernel32.dll
是一个特定于 Windows 的库。你不会在其他操作系统上找到它,比如 Ubuntu(除非你使用一些仿真层,比如 Wine)。因此,您不能在 Ubuntu 上使用特定于平台的代码。
那么,如何以独立于平台的方式使用命名管道?
幸运的是,.NET Framework 设计人员为您解决了这个问题:.NET Core 2.0 包含 System.IO.Pipes Namespace,其中包含用于通过命名管道进行进程间通信的托管包装器。
【讨论】:
谢谢,你拯救了我的一天。所以与其写 [DllImport("kernel32.dll", SetLastError = true)] 我应该写什么? @NiranjanGodbole:您可以查看 System.IO.Pipes 命名空间的文档,而不是[DllImport("kernel32.dll", SetLastError = true)] public static extern SafeFileHandle CreateNamedPipe(... etc. pp. ...)
,并在那里找到一个替换方法(创建命名管道)。对包括DllImport
的所有其他方法重复此操作。请注意,可能没有直接替换(因为 .NET 方法可能不会返回 SafeFileHandle 而是其他一些托管类),因此可能还需要稍微重写其余代码。
那么例如 NamedPipeServerStream pipe = new NamedPipeServerStream("testpipe") 将替换 public static extern SafeFileHandle CreateNamedPipe 对吗?
能否以e方法为例进行分享?
@NiranjanGodbole:MSDN 上有一些示例代码:docs.microsoft.com/en-us/dotnet/standard/io/…。不幸的是,我没有足够的个人经验来帮助翻译您的代码。以上是关于ubuntu 中 kernel32.dll 的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 DLL 'kernel32.dll' 中找到名为 'InterlockedIncrement' 的入口点 - VS2005@Win7 64 位
为啥 Windows 10 中 kernel32.dll 上的 GetFileVersionInfo 返回版本 6.2?