我正在为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。 那么,为什么函数不执行,有什么不对吗? 提前谢谢。
答案 0 :(得分:0)
你得到例外吗?是非托管DLL使用COM吗?如果是这样,请在MTA线程中调用它(只在后台任务中运行它),因为它在控制台应用程序中工作,这可能是问题所在。