- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
您好,我在 Windows 环境中用 c3 和 cpp 开发了示例应用程序。这个应用程序实现了这些程序之间的命名管道进行通信。我的 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;
}
}
}
我正在尝试找出与 kernal32.dll 等效的 ubuntu。有人可以帮我弄清楚这个问题吗?任何帮助将不胜感激。谢谢。
最佳答案
Ubuntu 中的 kernel32.dll 是什么?
Kernel32.dll
是特定于 Windows 的库。您不会在 Ubuntu 等其他操作系统上找到它(除非您使用某些仿真层,例如 Wine)。因此,您不能在 Ubuntu 上使用特定于平台的代码。
那么,如何以独立于平台的方式使用命名管道?
幸运的是,.NET Framework 设计者为您解决了这个问题:.NET Core 2.0 包含 System.IO.Pipes Namespace ,其中包含用于通过命名管道进行进程间通信的托管包装器。
关于c# - ubuntu 中 kernel32.dll 的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47881658/
我需要从 kernel/system/do_kill.c (Minix) 将一些信息写入我的特殊日志文件(例如,/home/log.txt) . 我已经尝试过: int filedesc; filed
我正在经历 Uboot 和内核启动过程。 FDT(平面设备树)到底有什么用? 我读过的许多链接都指出,uboot 以 FDT 的形式将板和 SOC 配置信息传递给内核 https://wiki.fre
我的操作系统是Fedora 17。最近,出现内核污染警告“kernel bug at kernel/auditsc.c:1772!-abrt”:不应报告此问题(这可能是一个已知问题)。发生内核问题,但
为 Linux 编译内核模块的教程,使用不同的 Makefile 语法。 Example 1 obj-m += rpi-pwm.o Example 2 obj-m := nothing.o 有什么区别
我正在浏览 Linux 网络设备驱动程序代码,想知道是否可以从驱动程序代码中调用设备层代码。 --- a/drivers/net/ethernet/realtek/8139too.c +++ b/dr
出于工具目的,我尝试附加到 kprobe 事件,但我对 kprobe 事件不太熟悉。我读到注册的 kprobes 列表可以在 /sys/kernel/debug/kprobes/list 中找到,但是
我在其他地方使用 LinK+ 来开发 linux 内核模块。我的开发机器安装了 Linux Mint 18 操作系统,内核版本为 4.4.xx。为了进行测试,我想将内核模块部署到内核版本为 3.16.
我正在玩弄 Android Linux 内核。内核是P970 V30B内核。可用here .我想找出特定的 cmdline 参数到底做了什么。 我知道它是命令行参数,其中有一个参数我找不到它到底做了什
是否可以将 PTE 指向不同的物理页面? 假设我目前在某个进程 A 的上下文中处于内核模式,该进程当前将地址 400k 映射到物理页号。 5. 我可以将该地址 (400k) 映射到物理页号吗? 6 ?
我正在开发一个要在路由器上运行的内核模块。路由器型号为 Netgear 的 DGN2200v2。它在 MIPS 上运行 Linux 2.6.30。我的问题是,当我加载我的模块时,似乎我的 module
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改进这个问题?更新问题,使其成为 Stack Overflow 的 on-topic。 6年前关闭。
在大型网格中执行的任务调用两个内核有区别吗 1. for(int i=0;i>>(MatrixA,MatrixB) } 2. dim3 dimBlock(16, 16); dim3 dimGrid(1
在 Linux 中,我生成了一个猜测 VM 并加载了另一个 Linux 实例。 VM 是通过 KVM/libvirt/qemu 生成的。 guest VM 被主机内核视为一个进程。让我们说由于某种原因
我想知道如何设置正确 MACH_TYPE或 arch_id对于内核。我搜索并找到了至少 2 个引用,其中内核会卡在“启动内核...”处。这些都给出了相同的答案。正确设置您的机器类型。但后来都没有提到如
kernel data inpage error蓝屏是一个不常见的问题,一般都是更新失败或者第三方软件冲突导致的,解决方法也非常简单,需要先安全模式进入系统,下面来看看详细的教程吧。 kern
当我用 app/console cache:clear 清除缓存时我收到错误: [Symfony\Component\DependencyInjection\Exception\ParameterNo
我正在玩 Raspberry 3,并尝试使用 U-Boot 启动 Linux 内核。 我构建了一个 Linux 内核(来自 github.com/raspberrypi)和 Busbox-Userla
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
长话短说,我一直在做一个项目,当我使用时我注意到: 1.9.3p392 :001 > `gzip` IRB::Abort: abort then interrupt! from (irb):1
我有一个服务,我在其中注入(inject) TokenStorage 并想要获取当前用户。 /** * * @Service("liip_theme.theme_request_listener"
我是一名优秀的程序员,十分优秀!