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... func を「静的」として定義しますか??? 定義されている.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 に答える