0

下面提到的是我在 c++ 中的 dll 函数

static bool t72CalculateRMDMethodResult( const double     AccountBalanceAtSetup,
                                     const long       ClientCurrentAge,
                                     const char       Frequency,
                                     double *         pRMDMethodResult,
                                     IRSLookupTable & LookupTable)

下面提到的是我的 c++ 类,它有一个指针作为参数传递给上述函数

class IRSLookupTable
{

    public:
        struct IRSLookupTableRow
        {
            unsigned int    Key;
            double          Value;
        };

        IRSLookupTable( const char * pFilename );
        IRSLookupTable( const struct IRSLookupTableRow Table[], const unsigned int NumEntries );
        virtual ~IRSLookupTable();

        bool         LookupValueByKey(const unsigned int Key, double * Value);
        virtual bool ParseLine( char * Buffer, unsigned int * Key, double * Value);
        bool         IsInitialized();

    private:
        typedef map <unsigned int, double> IRSLookupTableData;

        IRSLookupTableData m_IRSTableData;
        bool               m_bInitialized;
};

下面是我如何在 c# 中调用 c++ dll 函数,我不确定它是否正确,我无法输入 dll 函数

[DllImport("t72CalculatorDLL.dll", ExactSpelling = true, EntryPoint = "t72CalculateRMDMethodResult")]
    public static extern bool t72CalculateRMDMethodResult(double AccountBalanceAtSetup, int ClientCurrentAge, char Frequency, double* pRMDMethodResult, [MarshalAs(UnmanagedType.LPStruct)] ref IRSLookupTable LookupTable);

这是我用 C# 编写的 C++ 类的定义

    [DataContract]
public unsafe class IRSLookupTable
{
    public struct IRSLookupTableRow
    {
        public uint Key;
        public double Value;
    };

    public IRSLookupTable()
    {
        m_bInitialized = true;
    }
    public IRSLookupTable(char* pFilename)
    {
        //        uint Key;
        //        double Value;
        //        m_bInitialized = false;

        //        Debug.Assert( pFilename );
        //        if (pFilename ==null )
        //{
        //    // return without setting the flag to true
        //    return;
        //}

        //// open the file
        //std::ifstream InputFile(pFilename);
        //if ( ! InputFile )
        //{
        //    // return without setting the flag to true
        //    return;
        //}

        //while ( InputFile.getline( &gTmpBuffer[0], BUFFERSIZE) )
        //{
        //    if ( ! ParseLine( gTmpBuffer, &Key, &Value ) )
        //    {
        //        m_IRSTableData[Key] = Value;
        //    }
        //    else
        //    {
        //        // return without setting the flag to true
        //        return;
        //    }
        //}

        //m_bInitialized = true;
    }
    public IRSLookupTable(IRSLookupTableRow* Table, uint NumEntries)
    {
        m_bInitialized = false;

        for (uint i = 0; i < NumEntries; i++)
        {
            m_IRSTableData[Table[i].Key] = Table[i].Value;
        }

        m_bInitialized = true;
    }

    ~IRSLookupTable() { }

    public bool LookupValueByKey(uint Key, double* Value) { return true; }
    public virtual bool ParseLine(char* Buffer, uint* Key, double* Value) { return true; }
    public bool IsInitialized() { return true; }


    private SortedDictionary<uint, double> m_IRSTableData;
    private bool m_bInitialized;
}

任何人都可以帮我解决这个问题,我对 c# 完全陌生。

4

2 回答 2

1

我没有看到你将 C++ 函数导出到哪里???您将 t72... 函数定义为“静态”???您希望它仅在它定义的 .cpp 文件中可见?

我建议将您的 C++ 函数定义为:

extern "C" bool WINAPI t72CalculateRMDMethodResult( const double     AccountBalanceAtSetup,
                                     const long       ClientCurrentAge,
                                     const char       Frequency,
                                     double *         pRMDMethodResult,
                                     IRSLookupTable & LookupTable)

编辑您的 .def 文件并为 t72CalculateRMDMethodResult 添加一个导出条目。

您可以使用“dumpbin /exports mydll.dll”来确定函数是否正确导出。(显然用你的 dll 代替 mydll.dll)

于 2012-05-10T17:05:11.767 回答
0

如果您无法更改 C++ 代码,那么您可以编写一个 C++/CLI 层,将其公开给 C# 代码。通过这种方式,您可以避免任何丑陋的 DLL 导入和导出(我从未学习过如何做到这一点)。m 使用这种技术,您可以完全保持 C++ 代码不变。

我假设您至少使用 VS2005,因为您提到了 C#。

查看这篇文章C++/CLI 混合模式 DLL 创建

于 2012-05-14T21:51:26.067 回答