C# 如何将双精度值传递给C++;使用DLLImport的参数? 我有一个C++方法,它采用一个双参数类型,例如 extern "C" { __declspec(dllexport) void __cdecl GetResult (double resultLine); }

C# 如何将双精度值传递给C++;使用DLLImport的参数? 我有一个C++方法,它采用一个双参数类型,例如 extern "C" { __declspec(dllexport) void __cdecl GetResult (double resultLine); },c#,visual-c++,C#,Visual C++,在C#端,我可以调用该方法,但它总是将resultLine值转换为0。我用dLimPurt的外部特性调用C++ DLL方法: internal static class UnsafeNativeMethods { const string _dllLocation = "CoreDLL.dll"; [DllImport(_dllLocation)] public static extern void GetResult(double resultLine); } 我可以调用其他接受字符串值的方

在C#端,我可以调用该方法,但它总是将resultLine值转换为0。我用dLimPurt的外部特性调用C++ DLL方法:

internal static class UnsafeNativeMethods
{
const string _dllLocation = "CoreDLL.dll";
[DllImport(_dllLocation)]
public static extern void GetResult(double resultLine);
}
我可以调用其他接受字符串值的方法,但由于某些原因,当我传递双精度值时,它不起作用


这是传递双精度值的正确方法吗?或者我需要使用ref/out等吗?

您的呼叫约定不匹配,一侧是cdecl,另一侧是stdcall。使它们匹配,你应该重新开始工作。

你的通话约定不匹配,一边是cdecl,另一边是stdcall。让他们匹配,你就应该重新开始工作。

我不能100%确定这是否相关,但我在这里看到的一个根本错误是,你把呼叫约定搞错了。如果不指定任何内容,
DllImport
属性将使用
Winapi
调用约定,这实际上是
\uu stdcall
,而您需要
\uu cdecl

要解决此问题,请将字段设置为:


<>或将C++约定的调用约定设置为“代码>ysSTDCALL//CODE”(如果您不需要VARARG <代码>,Y.STDCALL/<代码>也比Y.CCDLL</代码>更有效。

< P> >我不确定100%这是相关的,但我在这里看到的基本错误是,您调用调用约定错误。如果不指定任何内容,
DllImport
属性将使用
Winapi
调用约定,这实际上是
\uu stdcall
,而您需要
\uu cdecl

要解决此问题,请将字段设置为:


<>或将调用约定设置为C++(C++)上的代码>(a)sddLea/Cuff>(如果不需要VARARG <代码>,ysSTDLCAE/也比Y.CCDLL</代码>更有效。

请从H文件中显示精确的C++函数定义,以及从C程序中显示整个DLLIMPURE语句。如果不清楚,请告诉我。很清楚。请参阅下面关于调用约定的答案。如果这不能解决问题,那么代码中的其他地方就有问题了。您需要单步确定您传递的值确实是零以外的。请从.h文件中显示确切的C++函数定义,以及从C语言程序中显示整个DLLIMPORT语句。以上所述,请让我知道是否还不清楚。请参阅下面关于调用约定的答案。如果这不能解决问题,那么代码中的其他地方就有问题了。您需要单步执行,以确保传递的值不是零。@Preet:谢谢,但这只是应用了更正的操作代码。:)@普里特:谢谢,但这只是应用了更正的操作码。:)
internal static class UnsafeNativeMethods
{
const string _dllLocation = "CoreDLL.dll";
[DllImport(_dllLocation), CallingConvention=CallingConvention.Cdecl]
public static extern void GetResult(double resultLine);
}