我致力于一个需要网络互操作性、没有管理的代码的项目。 我开始与大家合作。 数周前,尽管我在C/C++方面有很多经验,但我感到惊讶的是,加拿大航天中心是如何与P/Invoke打交道的。 详见下文。 我的同事写了这一职务。
__declspec(dllexport) int __stdcall ReadIPWSensor(unsigned int deviceClassId, void *buffer) {...}
我不得不从C#模块中提一下。 我进口了这一功能。
[DllImport("ipw", CallingConvention = CallingConvention.StdCall)]
extern static int ReadIPWSensor(uint deviceClassId, IntPtr buffer);
只是为了找到一个例外(System.EntryPoint NotFoundException, Unable to found an entry point known ReadIPWSensor in DL ipw )。 我使用了“依赖性Walker”工具,发现该功能是作为出口吗?ReadIPWSensor@YGHIPAX@Z。 (我的同事想在外交部档案中出口。) 就快速测试而言(未管理的《反歧视法》汇编的资料非常缓慢) 我将进口定义改为:
[DllImport("ipw", EntryPoint = "#22", CallingConvention = CallingConvention.StdCall)]
extern static int ReadIPWSensor(uint deviceClassId, IntPtr buffer);
a 系22。 测试成功地采用了新的进口定义。
我的第一个问题是:在处理单项职能出口方面有哪些良好做法? 使用出口商品是否是一种良好做法?
在我的案件中,我可以查阅C++源代码和DEF文档,因此我增加了出口,并改变了进口定义。
[DllImport("ipw", CallingConvention = CallingConvention.StdCall)]
extern static int ReadIPWSensor(uint deviceClassId, IntPtr buffer);
我知道,在我们的项目中已经使用了另一项职能,希望将我的守则与现有的守则进行比较。 职能的定义是:
extern "C" __declspec(dllexport) int __stdcall LoadIPWData(void *buffer)
进口
[DllImport("ipw", CallingConvention = CallingConvention.StdCall)]
extern static int LoadIPWData(IntPtr buffer);
令我惊讶的是,Walker工具显示,这一功能是出口到——LoadIPWData@4(我的同事想再出口到法国能源公司档案中)。 然而,没有制度。 入境点NotFoundException错误。 显然,《南极海生委》一些how设法解决了正确的名称。 似乎存在某种倒退机制,使《刑法》能够找到正确的功能。 我可以轻易想象,它会把参数的大小归纳起来,并且正在寻找“功能_name@the_sum_of_all_para amount_sizes”,尽管这似乎非常简单。
我的第二个问题是:在P/Invoke期间,CLR如何与出口职能名称相匹配?
在这种情形下,我认为,该中心实际上隐藏着一种ug子,而LoadIPWData功能应当从其他未管理的单元中取用。 Maybe 我是一旁听的,但我更想知道《刑法》如何实际运作。 不幸的是,我对这个专题的所有探索都是徒劳的。