English 中文(简体)
CLR如何在P/Invoke期间与出口名称相匹配?
原标题:How does CLR match the exported names during P/Invoke?
  • 时间:2012-05-06 18:59:29
  •  标签:
  • clr
  • pinvoke

我致力于一个需要网络互操作性、没有管理的代码的项目。 我开始与大家合作。 数周前,尽管我在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 我是一旁听的,但我更想知道《刑法》如何实际运作。 不幸的是,我对这个专题的所有探索都是徒劳的。

最佳回答

pin车已经掌握了几个共同的DLL出口命名计划。 它知道......dec功能往往有领先的强调,......以32轨方式进行的召唤通常与领先的强调和线索(x)被推崇的争辩所成。 它还知道,A类或W类外线输出了双轨功能,这是一种命名办法,用以区分接受方形状的功能,并且具有反向和统法协会编码版本。 相应的[驱逐]财产是CharSet。 它只是试着他们,直到找到了。

它不了解关于C++编篡人名称编码校正规则(aka mangling)的任何内容,因此,你必须使用<代码>extern “C”以手方式加以压制。

问题回答

暂无回答




相关问题
Marshaling Delphi 5 OleVariant to C#

I m trying to use some legacy Delphi 5 DLLs from C# (2.0/3.5). Some of the exported functions are declared as such: function SimpleExport: OleVariant; stdcall; function BiDirectionalExport(X: ...

P/Invoke for pointer to array of char

I have a DLL that I need to P/Invoke the following method: DWORD Foo( int a, int *b, char *c ); Per the documentation, parameter c is an out parameter that must be a ...

How does the .NET Framework Class call Platform API?

We know that .NET framework class encapsulate the Win32 API, now I am wondering how the .NET framework class call Win32 API? Ways I know so far: Through P/Invoke VC++/CLI Both 1 and 2 Anybody ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How should I declare this C struct for interop?

I have to use a legacy C routine in the application I am developing. The code in here works, but I have to convert almost all the fields to char arrays in order to use it. There is a better way to do ...

热门标签