2013-10-18 6 views
5
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace PatternSequencer 
{ 
    class Version 
    { 
     public string majorVersion; 
     public string minorVersion; 

     ushort* pmajorVersion; 
     ushort* pminorVersion; 
     ulong status; 

     [DllImport(@"c:\DOcuments\Myapp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
     public static extern ulong SRX_DllVersion(ushort* pmajorVersion, ushort* pminorVersion); 


     public Version() 
     { 
      status = SRX_DllVersion(&pmajorVersion, &pminorVersion); 
      if (status) 
      { 
       majorVersion = "1 - " + *pmajorVersion; 
       minorVersion = "1 - " + *pminorVersion; 
      } 
      else 
      { 
       majorVersion = "0 - " + *pmajorVersion; 
       minorVersion = "0 - " + *pminorVersion; 
      } 
     } 
    } 
} 

Viene generato un puntatore di errore e buffer di dimensioni fisse possono essere utilizzati solo in un contesto non sicuro. Come posso passare i puntatori alla DLL C++? Sono nuovo di C#, ti prego, aiutamiCome accedere a una funzione C++ che prende i puntatori come argomento di input da un C#

+2

Dichiarare i parametri come 'ref', che eliminerà la necessità di codice' non sicuro'. – William

+0

@William: puoi spiegarlo in dettaglio. Sono nuovo di C# – user2495173

+0

Quello che vuoi fare qui è noto come [Marshalling] (http://msdn.microsoft.com/en-us/magazine/cc164193.aspx). È un argomento importante, ma per casi semplici come questo, non è troppo difficile. –

risposta

8

Invece di utilizzare un tentativo unsafe contesto:

[DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
public static extern ulong SRX_DllVersion(out ushort pmajorVersion, out ushort pminorVersion); 

per effettuare la chiamata:

ushort major, minor; 
SRX_DllVersion(out major, out minor); 

sto assumendo i parametri SRX_DllVersion vengono emessi solo, se non cambia out-ref.

Evitare il codice unsafe quando possibile.

+0

Questa è sicuramente la strada da percorrere; non vi è alcuna ragione per utilizzare qui il codice non sicuro. –

+0

Perfetto funziona !! Grazie mille :) Dove posso leggere di più su questo? – user2495173

+0

[Dati di marshalling con Platform Invoke] (http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx) e [PInvoke.net] (http://pinvoke.net) se sono necessari campioni o comuni importazioni. – William

1

è necessario contrassegnare che il metodo come unsafe

[DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
public static extern ulong SRX_DllVersion(out ushort pmajorVersion, out ushort pminorVersion); 
+0

Questo non funziona. Ecco il mio intero codice: – user2495173

+0

@ user2495173 modifica la tua domanda per includere il codice completo se lo trovi pertinente. – Renan

+1

Questa sintassi può essere utilizzata per un blocco che fa parte del corpo di un metodo (o costruttore, accessore). Un intero membro della classe non è all'interno di un blocco. –

3

Naturalmente hai a contrassegnare la classe unsafe per farlo funzionare.

unsafe class Version 
{ 
    [DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
    public static extern ulong SRX_DllVersion(ushort* pmajorVersion, ushort* pminorVersion); 
} 

Se si dispone di un solo metodo, è possibile contrassegnare il metodo come unsafe.

E non dimenticare di attivare l'opzione del compilatore "Consenti codice non sicuro".

0

Prova a utilizzare il blocco unsafe. Ulteriori informazioni su unsafe.

Problemi correlati