从C#dll调用C ++ dll并得不到任何结果

时间:2018-06-15 07:08:36

标签: c# c++ dll

我正在为Revit(一个土木工程软件)开发一个C#dll,而C#dll从我自己开发的非托管C ++ dll中调用该函数。当调用非托管C ++ dll中的函数 compareMarkedPointsWithBIMModel _ 时,没有任何内容,似乎非托管C ++ dll中的函数不会执行。

以下是详细信息:

在非托管C ++ DLL中

extern "C" __declspec(dllexport) void compareMarkedPointsWithBIMModel_(
char* a_,
const double* list,
int listLength) {

std::vector<std::vector<double>> b; 
for (int i = 0; i < listLength / 6; i++)
{
    std::vector<double> cc;
    for (int j = 0; j < 6; j++)
    {
        cc.push_back(list[i * 6 + j]);
    }
    b.push_back(cc);
}

std::string a = a_; 

CompareMarkedPointsWithBIMModel cmpb(a, b);
cmpb.readMarkedPoint3DInfo();
cmpb.computeAB();
cmpb.computeRT();
cmpb.computeDeviation();
system("pause");

}

在C#dll

[DllImport("Test_OpenCV.dll")]
    public static extern void compareMarkedPointsWithBIMModel_(
        string st1,             
        ref double list_,     
        int listLength_);       

    public Result Execute(
        ExternalCommandData commandData,
        ref string messages,
        ElementSet elements)
    {                       
        string smallImagesPath =        
            "C:/D/Bundler04ForReconstruction/results/result_DF510";            
        double[] list;
        int listLength;
        setList1(out list, out listLength);           

        compareMarkedPointsWithBIMModel_(
            smallImagesPath,
            ref list[0],
            listLength);

        return Result.Succeeded;
    }        

    public void setList1(out double[] list, out int listLength)
    {
        /// realize of the function         

    }

我在互联网上寻找解决方案,但没有找到有用的解决方案。 我还尝试在C#控制台项目中调用非托管C ++ DLL(特别是函数),它可以工作!它很奇怪。 此外,非托管C ++ DLL和C#dll的平台都是x64。 那么,为什么函数不执行,有什么不对吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

你得到例外吗?是非托管DLL使用COM吗?如果是这样,请在MTA线程中调用它(只在后台任务中运行它),因为它在控制台应用程序中工作,这可能是问题所在。