无法在C ++ / CLI中找到入口点

时间:2014-08-15 20:43:40

标签: c# c++-cli dllexport

对不起,虽然我试图缩短它,但它仍然很长。

我知道一些C#和C ++,但我正在学习CLI。我有一个原生C函数执行一些,呃,统计计算。它有1或2个嵌入式汇编语言指令 - 它的优点是速度快(就像消防水管的饮用水一样)。我不会重写它。因此,我试图将它放入一个DLL并从C#调用它。因此C ++ / CLI。

根据我的估算,以下代码应该接近工作[编组可能是错误的]。经过广泛的Stack_Overflow研究 - 顺便说一下,读过很多问题并且有一些很好的答案 - 我已经完成了编译的重点。 C#gui完成了它的工作,并且能够为包装函数组合一个可能有效的参数列表。那么这个运行时错误......

  

未处理的类型' System.EntryPointNotFoundException'发生在gui_proj.exe

     

其他信息:无法找到名为' process_these_files'的入口点。在DLL' Wrapper_proj.dll'。

我把代码煮成了必需品(我想)。该DLL将在gui proj中引用。对象浏览器似乎看到了入口点。 Dependency Walker全都搞砸了 - " IESHIMS.DLL"真?! Silurian Inspect_Exe表示它可以加载dll并显示基本属性,但不能显示任何导入/导出。 [两个项目都是64位配置]。我在构建之前清理了解决方案。

如何获得一个切入点 找到' ?我需要编组文件名吗?或编组(空)结果数组?

gui_proj.cs

// I've also tried CallingConvention.StdCall
[DllImport("Wrapper_proj.dll", SetLastError = true, CharSet = CharSet.Ansi, EntryPoint = "process_these_files", CallingConvention = CallingConvention.Cdecl)]

static extern void process_these_files( [In] int length, [In] String[] file_names, [Out] byte[] output_calcs, [Out] UInt64[] file_sizes);

private void Calcs_on_files_ThreadStart(object oo)
{
    List<int> fil_indices = new List<int>();
    List<string> fil_names = new List<string>();
    List<UInt64> fil_sizes = new List<UInt64>();

    foreach (DataGridViewRow rr in dgvFiles.SelectedRows)
    {
        fil_indices.Add(rr.Index);
        fil_names.Add( ((string)rr.Cells["Full_Name"].Value) );
        fil_sizes.Add( ((UInt64)((long)rr.Cells["File_Size"].Value)) ); // expected size
    }
    int jj = fil_names.Count;
    int kk = 32 * fil_names.Count;
    byte[] calc_results = new byte[kk]; // "byte" is equivalent to "uint8_t"
    UInt64[] siz_results = new UInt64[jj];
    string[] fil_arr = fil_names.ToArray();
    process_these_files( jj, fil_arr, calc_results, siz_results);
}

Wrapper_proj.h

#include "stdafx.h"
#include <fstream>      // std::ifstream
...

// compiler supposedly defines *"_EXPORTS", though just being definitive here
#define Wrapper_proj_EXPORTS

#ifdef Wrapper_proj_EXPORTS
#define Wrapper_proj_API __declspec(dllexport) 
#else
#define Wrapper_proj_API __declspec(dllimport) 
#endif

namespace Wrapper_proj {
    // ++++ see note below
    public ref class wrap_it
    {
    public:
        // +++ see note below
        static  void process_these_files(
            int length, // each array has same length (varying sizes though, of 

course)
            array<System::String^>^ files,
            array<System::Byte>^ calcs,
            array<System::UInt64>^ fil_sizes);
    };
}

Wrapper_proj.cpp

#include "stdafx.h"
#include "Wrapper_proj.h"

using namespace System;
using namespace System::Collections::Generic;
using namespace System::Runtime::InteropServices;
using std::ios;

namespace Wrapper_proj {

    void wrap_it::process_these_files(
        int arr_length,
        array<System::String^>^ files,
        array<System::Byte>^ calcs,
        array<System::UInt64>^ fil_sizes)
    {
...
    // call native calc. fcn. (that has asy. lang. instructions)
...
    };  // process_these_files
}   // end namespace

+++如果我尝试以下声明(在wrapper_proj.h中) &#34;静态Wrapper_proj_API void process_these_files(&#34; 然后我得到

  

错误C3387:&#39; process_these_files&#39; :   __declspec(dllexport)/ __ declspec(dllimport)无法应用于托管类型的成员

     

错误C3395:&#39; City_Hash_Lib :: City_Hash :: process_these_files&#39; :   __declspec(dllexport)不能应用于具有__clrcall调用约定的函数

++++想保留&#34;公共参考类#34;但奇怪的是它似乎并没有阻止dllexport。

Dumpbin / EXPORTS说这个......

  

转储文件Wrapper_proj.dll   文件类型:DLL   摘要       3000 .data       2000年.nep       1000.pdata 27000 .rdata       1000 .reloc       3000 .rsrc       A000 .text

制作.def文件以导出&#34; process_these_files&#34;产生了错误C3387。

1 个答案:

答案 0 :(得分:3)

由于您使用的是C ++ / CLI,因此生成的图像是.NET图像。您需要做的就是在C#文件中导入命名空间,并在C#项目中使用适当的引用。

我试过这个C#代码:

using Callee;

namespace Caller
{
    class Program
    {
        static void Main(string[] args)
        {
            Byte[] calcs = new Byte[10];
            UInt64[] fil_size = new UInt64[10];
            String[] files = new String[1];
            files[0] = "file1";

            Class1.process_these_files(1, files, calcs, fil_size);

        }
    }
}

我必须在Visual Studio中使用项目设置来使链接器设置对齐。

我刚开始将示例代码推送到GitHub。您可以从https://github.com/kc1073/Samples

下载整个项目