2009-10-21 2 views
2

У меня мало опыта на таком языке, как C#, поэтому я был бы доволен, если бы вы, ребята, могли мне помочь. Я написал этот метод в C++ с использованием библиотеки MPIR:Данные маршаллинга для C#

mpz_class SchnorrProtocol::getX(const mpz_class& r) const 
{ 
    mpz_class x; 
    mpz_powm(x.get_mpz_t(), this->params_.getBeta().get_mpz_t(), r.get_mpz_t(), this->params_.getP().get_mpz_t()); 
    return x; 
} 

и теперь я хочу, чтобы импортировать его в C#:

#region Filter & P/Invoke 
#if DEBUG 
     private const string DLL = "schnorrd.DLL"; 
#else 
     private const string DLL = "schnorr.DLL"; 
#endif 

     [DllImport(DLL)] 
    "method definition" 
     ...... SchnorrProtocol::getX(......); 

моя проблема, я не знаю, как это сделать. Не могли бы вы помочь мне?

ответ

1

Вы должны использовать structlayout attribute для определения mpz_class, т.е.

[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)] 
    public class mpz_class 
    { 
     // your class definition 
    } 

    [StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)] 
    public class SchnorrProtocol 
    { 
      // your class definition. 
    } 

И here's how вы маршалу метод внутри C++ класс

[ DllImport(DLL, 
    EntryPoint="[email protected]@@[email protected]", 
    CallingConvention=CallingConvention.ThisCall)] 
    public static extern int TestThisCalling(SchnorrProtocol prot); 
+0

проблема является: mpz_class является C++ класс, который Имеющийся с: #include так что стандартные операторы и различные стандартные функции являются обернутыми чтобы разрешить арифметику с этим классом. Я не знаю, как написать определение такого класса. :( – Tatiana

Смежные вопросы