2012-05-10 9 views
0
下記

は、cの私のDLL関数++C#のコードは、C++ DLL関数を呼び出していません(パラメータとしてクラスポインタを持っている)、呼び出すことになっていることを、私はC++のコードを変更しないでください

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); 

これは

[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++、私はC#で書かれているクラスの定義0は、私はC#に完全に新しいです。

+1

これは* some *タイトルです! – Nick

+0

コードのC#側にIRSLookupTable型を定義しましたか?もしそうなら、その定義を含めることができます。 – user957902

+0

はい私は、上記の質問に定義を提供しました – krishna555

答えて

1

C++関数をエクスポートする場所が表示されません。あなたはt72 ... funcを "静的"として定義しますか?あなたはそれが???に定義されている.cppファイルにしか表示されないようにしたい

私はとしてあなたのC++ funcを定義するお勧め:

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

編集し.defファイルやt72CalculateRMDMethodResultの輸出エントリを追加します。

"dumpbin/exports mydll.dll"を使用して、関数が正しくエクスポートされたかどうかを判断できます。 (明らかにmydll.dllのdllを置き換えてください)

+0

私はC++コードを変更する権利がありません。なぜなら、私は利用可能な他の方法を見つけようとしています。私はC++コードのこれらの部分を使用し、c#を使ってテストする必要がありますが、C++コードを変更しないといけないので、C++コードに触れることでこれを行う方法があります。いくつかのサンプルコードを入力してください。 – krishna555

+0

"dumpbin/exports yourdll.dll"(dllに置き換えて)関数をエクスポートするかどうかを確認する必要があります。そうでなければ、あなたは立ち往生しています。 –

+0

はい私はそれを試して、それは関数への引数としてクラスポインタを持っていると私は両方のポインタに一致することができませんでした輸出されませんでしたC + +関数とC#関数私は、私が最初から持っている問題。これに関してあなたの頭に何かが現れたら教えてください。ご協力いただきありがとうございます... – krishna555

0

C++コードを変更できない場合、C++コードをC#コードに公開するC++/CLIレイヤーを記述することができます。この方法では、醜いDLLのインポートとエクスポートを避けることができます(これを行う方法は決して学びませんでした)。この手法を使用すると、C++コードを完全に変更することなくそのまま残すことができます。

私はあなたがC#について言及して以来、少なくともVS2005を使用していると仮定しています。

この記事をチェックアウトC++/CLI Mixed Mode DLL Creation

関連する問題