C 呼叫C dll一些走過坑的筆記

2021-09-10 08:19:19 字數 1697 閱讀 9085

筆記1:

c dll的call convention 是cdecl ,弄了乙個callback,供外部呼叫。

c#方面 在debug模式下,委託不加unmanagedfunctionpointer是正常的,在release模式下不加unmanagedfunctionpointer不行,加上unmanagedfunctionpointer才正常。

錯誤的寫法:

internal delegate void internal_can_receivecallback_t(intptr device, can_rxpacket_t rx);

internal delegate void internal_can_txerrorcallback_t(intptr device, can_txpacket_t tx);

internal delegate void internal_can_controlunitstatusupdatecallback_t(intptr device, can_controlunitstatus_t status);

正確的寫法:

[unmanagedfunctionpointer(callingconvention.cdecl)]

internal delegate void internal_can_receivecallback_t(intptr device, can_rxpacket_t rx);

[unmanagedfunctionpointer(callingconvention.cdecl)]

internal delegate void internal_can_txerrorcallback_t(intptr device, can_txpacket_t tx);

[unmanagedfunctionpointer(callingconvention.cdecl)]

internal delegate void internal_can_controlunitstatusupdatecallback_t(intptr device, can_controlunitstatus_t status);

總結:

以後呼叫一切的c/c++ dll  任何函式 任何委託 全部顯式寫出  callingconvention

筆記2:

有如下函式:

[dllimport("my.dll",callingconvention= callingconvention.cdecl,entrypoint = "setcallback")]

private static extern void setcallback(mycallback_t callback);

相當於c#寫callback供 c dll呼叫, 那麼在c#方面一定要搞乙個委託的例項字段 將c#方法付給這個例項,再將例項傳給c dll

錯誤寫法:

c#:

public void foo()

setcallback(foo);

正確的寫法:

public void foo()

private mycallback_t internalmycallback;

internalmycallback=foo;

setcallback(internalmycallback);

ACM走過的坑和一些細節

1.一道簡單計算幾何,區域性變數與全域性變數同名,然後忘記在函式內宣告區域性變數,然後編譯通過了。2.省賽選拔時,一道二分 bfs走迷宮的題,漏了起點和終點重合的情況,要注意一開始入隊的狀態是否是結束狀態。3.線段樹的一道題,len陣列記錄根節點所代表線段覆蓋的長度,有小數,改來改去,根本沒注意到l...

C 使用protobuffer的一些坑

原文 最後總結一句,使用protobuf,在c 中給string賦值c字串的時候一定要指定長度,因為事實上賦值的內容可能是乙個bytes陣列,而不是乙個標準的 0 結尾的字串。賦值範例如下 char pdata 1024 serialized data int length getdatalengt...

關於C 引用的一些坑

這幾天在找專案的bug發現前輩的引用寫法有些問題,導致資料不同步。所以寫一篇文章記錄一下 c 裡面有很好用的各種容器,list dictionary等等,但是我們普通用法就是以一些值型別或者 string 來作為key,但是專案一旦大了,key可能就是乙個複雜的引用型別。csharp using s...