C#dllimport意外崩溃
C# DllImport crashes unexpectedly
i具有带有C 组件的C#应用程序。我正在与模块之间的DllImport
通信。该应用程序工作了很多天,没有问题,并且有时意外崩溃。
[DllImport("recorder", CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr start_recording();
是否可以在受保护的容器中运行C 零件,以免整个应用程序崩溃?
事件查看器
应用程序错误
Faulting application name: Recorder.exe, version: 1.0.0.0, time stamp: 0x59eef7cb
Faulting module name: avformat-57.dll, version: 57.71.100.0, time stamp: 0x00000000
Exception code: 0xc0000005
Fault offset: 0x00000000000d7e7f
Faulting process id: 0x186c
Faulting application start time: 0x01d3620b7e41ef96
Faulting application path: C:TestRecorder.exe
Faulting module path: C:Testavformat-57.dll
Report Id: 3fde49fc-d2ed-11e7-bf5c-002590abb7d4
.NET Runtime
Application: Recorder.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: exception code c0000005, exception address 000007FEEA407E7F
通常,在某些情况下,总是会导致一个过程退出,而您与之无关。
虽然您可以通过捕获异常,设置信号处理程序或仅修复错误的错误处理一些错误,但这只会修复特定的情况,不会给您提供一般的解决方案,并且您可能没有控制完全在模块上。
在这种情况下,常见的解决方案是将模块分为不同的代理过程,该过程将与您自己的应用程序进行通信。
在这里您可以找到更多有关Crocecess Communications的信息
我决定使用命名pipes 非常快,我可以在两个方向上进行通信。
C 示例
cout << "Connecting to pipe..." << endl;
// Open the named pipe
// Most of these parameters aren't very relevant for pipes.
HANDLE pipe = CreateFile(
L"\\.\pipe\MyServerPipe",
GENERIC_READ, // only need read access
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
//NULL,
NULL
);
if (pipe == INVALID_HANDLE_VALUE) {
cout << "Failed to connect to pipe." << endl;
// look up error code here using GetLastError()
system("pause");
return 1;
}
cout << "Reading data from pipe..." << endl;
// The read operation will block until there is data to read
char buffer[128];
DWORD numBytesRead = 0;
BOOL result = ReadFile(
pipe,
buffer, // the data from the pipe will be put here
127 * sizeof(char), // number of bytes allocated
&numBytesRead, // this will store number of bytes actually read
NULL // not using overlapped IO
);
if (result) {
buffer[numBytesRead / sizeof(char)] = ' '; // null terminate the string
cout << "Number of bytes read: " << numBytesRead << endl;
//wcout << "Message: " << buffer << endl;
//wstring ws(buffer);
//string str(ws.begin(), ws.end());
cout << "Test:" << buffer << endl;
}
else {
wcout << "Failed to read data from the pipe." << endl;
}
// Close our pipe handle
CloseHandle(pipe);
//wcout << "Done." << endl;
system("pause");
return 0;
C#获取所有可用管道
var listOfPipes = System.IO.Directory.GetFiles(@"\.pipe")
C#example
using (var pipeServer = new NamedPipeServerStream("MyServerPipe", PipeDirection.InOut))
{
Console.WriteLine("NamedPipeServerStream object created.");
// Wait for a client to connect
Console.Write("Waiting for client connection...");
pipeServer.WaitForConnection();
Console.WriteLine("Client connected.");
try
{
using (var bw = new BinaryWriter(pipeServer))
{
var data = Encoding.ASCII.GetBytes("SendInformation data1 data2 data3");
//var data = Encoding.ASCII.GetBytes("Startrn");
bw.Write(data);
}
}
// Catch the IOException that is raised if the pipe is broken
// or disconnected.
catch (IOException e)
{
Console.WriteLine("ERROR: {0}", e.Message);
}
}
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 在C++中对T*类型执行std::move的意外行为
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 使用调试/崩溃报告将应用程序部署到客户端
- 处理除以零会导致<csignal>意外行为
- 为什么所有C++编译器都会崩溃或挂起此代码
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- C#dllimport意外崩溃
- 线程导致意外崩溃
- Visual c++项目在用SFML加载纹理时意外崩溃
- Qt Creator 中的程序使用 opencv 意外崩溃