奇怪的dumpbin导出表

时间:2010-04-07 13:18:41

标签: c# interop

我正在插入一个c ++ dll并试图访问它的函数。 下面是来自dll的dumpbin / exports输出:

Dump of file C:\C#Processes\SummarizerApp\SummarizerApp\lib\summarizer37.dll
File Type: DLL
Section contains the following exports for summarizer37.dll

00000000 characteristics
458962FF time date stamp Wed Dec 20 11:21:19 2006
    0.00 version
       1 ordinal base
       4 number of functions
       4 number of names

ordinal hint RVA      name

      1    0 00002960 ?delete_summarization@inxight@@YAXPAVsummarization_interface@1@@Z
      2    1 00016240 ?delete_summarizer@inxight@@YAXPAVsummarizer_interface@1@@Z
      3    2 000105E0 ?make_summarization@inxight@@YAPAVsummarization_interface@1@AAVsummarizer_interface@1@AAVbyte_stream_interface@1@ABVsummarization_input_options@1@ABVsummarization_sentence_output@1@ABVsummarization_phrase_output@1@PBDI5@Z
      4    3 0001BC40 ?make_summarizer@inxight@@YAPAVsummarizer_interface@1@PBD00@Z

Summary

    4000 .data
    B000 .rdata
    4000 .reloc
   2E000 .text

注意序数#3。它包括我需要调用的几种方法,具体来说:
make_summarization
summarization_input_options
summarization_sentence_output
summarization_phrase_output

已经完成了这个dll的JNI包装,并且知道上面的函数(它们都是类的构造函数)可以从JNI使用的“extern C”获得,以非拼写的形式。 我可以使用dllimport的调用约定属性来访问它们未修饰的吗?

在C ++世界中,当在同一序号下导出多个函数时,它的含义是什么?访问它们的方法是什么? 谢谢, 吉姆

1 个答案:

答案 0 :(得分:1)

DllImport属性的EntryPoint字段可用于import functions by ordinal(序号前加#)。
它也可以用于import functions by their mangled name 如果您真的拥有C ++库所公开的所有功能的纯“extern C”包装器,那么这很容易。
如果不这样做,您可以构造C ++ / CLI包装器以在托管和非托管之间进行桥接。

vc\bin文件夹中的

undname.exe可用于解压缩已编译的C ++名称:

class inxight::summarization_interface * __cdecl inxight::make_summarization(
   class inxight::summarizer_interface &,
   class inxight::byte_stream_interface &,
   class inxight::summarization_input_options const &,
   class inxight::summarization_sentence_output const &, 
   class inxight::summarization_phrase_output const &,
   char const *, unsigned int , char const *)