将托管事件处理程序传递给 Linux 中的非托管代码
Passing managed event handler to unmanaged code in Linux
我一直在为将在Linux下运行的现有C++库编写.Net Core C#包装器。该库具有以下内容:
int newrelic_record_metric(const char *name, double value);
void newrelic_register_message_handler(void*(*handler)(void*));
void *newrelic_message_handler(void *raw_message);
第一种方法很容易包装:
internal static class AgentSdkWrapper {
[DllImport("newrelic-transaction")]
public static extern unsafe int newrelic_record_metric(StringBuilder name, double value);
我正在为第二个版本的签名而苦苦挣扎,我不知道如何将其转换为 C#。我知道我正在处理空指针,但我不确定如何处理它们。
另外,根据库文档,我需要将第三个方法注册为第二个方法的回调:
您必须注册所需的回调,该回调将在事务完成时将数据发送到New Relic。您需要注册已定义的默认newrelic_message_handler回调:
newrelic_register_message_handler(newrelic_message_handler(;
我认为我需要将newrelic_message_handler
分配给 C# 委托并将其传递给 newrelic_register_message_handler
,但我不清楚我是如何到达那里的。
如果我
正确理解了文档,您只需要将指向第二个函数的指针传递给newrelic_message_handler
。
这意味着对于所有意图和目的,您的第二个函数将如下所示:
[DllImport(...)]
static extern void newrelic_register_message_handler(IntPtr handler);
因为实际上你只是传递一个指针,并不真正关心类型。
要获取指向newrelic_message_handler
的指针(假设这是一个 dll 导出函数(,您需要使用 GetProcAdress
[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr LoadLibrary(string lpFileName);
您的最终代码将是:
var module = LoadLibrary("newrelic-transaction");
var proc = GetProcAddress(module, "newrelic_message_handler");
newrelic_register_message_handler(proc);
相关文章:
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 异步接口托管 - > 非托管代码
- 从C++(非托管代码)检索数组到 C 尖锐形式(托管)
- 将C++非托管代码转换为 C#
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 使用 P/Invoke 时存储非托管代码的数据
- Windows 服务导入C++非托管代码
- P/从获取"tried to access protected memory error"调用非托管C++代码
- 将数据从非托管代码传递到托管代码
- 从 VB.NET 调用非托管代码C++ dll
- 当C#中的字节数组传递给结构中的非托管代码时,会发生什么情况
- 在托管代码和非托管代码之间传递非托管结构的安全数组
- 如何调试C++非托管代码中的较低级别文件访问异常/崩溃
- 自定义Direct2D呈现托管代码和非托管代码之间的批封送处理
- winform中的C++非托管代码
- 如何减少 Visual Studio 非托管代码中的发布生成时间
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 需要从非托管c++代码中调用托管代码
- 使用固定指针将大型数据结构传递给非托管代码