2013-10-18 29 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; 
      } 
     } 
    } 
} 

它引發錯誤指針和固定大小的緩衝區只能用於不安全的上下文中。我如何將指針傳遞給C++ dll?我是新來的C#,請幫我如何訪問以指針作爲C#輸入參數的C++函數

+2

聲明參數爲'ref',這將消除對'不安全'代碼的需要。 – William

+0

@William:請你詳細解釋一下。我是新來的C# – user2495173

+0

你想在這裏做什麼被稱爲[Marshaling](http://msdn.microsoft.com/en-us/magazine/cc164193.aspx)。這是一個很大的話題,但對於這樣的簡單案例來說,這並不難。 –

回答

8

而不是使用一個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); 

要撥打電話:

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

我假設SRX_DllVersion參數僅輸出,如果不改變outref

儘可能避免使用unsafe代碼。

+0

這絕對是要走的路;在這裏沒有任何理由使用不安全的代碼。 –

+0

完美的作品!非常感謝:)我在哪裏可以閱讀更多關於此? – user2495173

+0

[平臺調用數據處理](http://msdn.microsoft.com/zh-cn/library/fzhhdwae.aspx)和[PInvoke.net](http://pinvoke.net)如果您需要樣本或常見進口。 – William

1

你必須標記該方法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

這不起作用。這裏是我的整個代碼: – user2495173

+0

@ user2495173請編輯您的問題,包括完整的代碼,如果你發現它相關。 – Renan

+1

該語法可用於作爲方法體(或構造函數,訪問器)的一部分的塊。整個班級成員不在一個區塊內。 –

3

當然,你已經將類標記unsafe,使其工作。

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

如果您只有一種方法,您可以將方法標記爲unsafe

並且不要忘記打開「允許不安全的代碼」編譯器選項。

0

嘗試使用unsafe塊。 更多關於unsafe