簡體   English   中英

在C#中使用DLL

[英]Using DLL in C#

我試圖在C#Windows窗體應用程序中使用舊的C DLL。 好像我在為輸出參數使用錯誤的數據類型。

DLL源代碼:

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT INT CALLBACK Complemento (LPSTR) ;
EXPORT INT CALLBACK MatchCode (LPSTR, LPSTR, LPSTR, LPSTR);

C#DLL導出

[DllImport(
    @"<MYDIR>Fonetica.dll",
    CharSet = CharSet.Ansi)]
public static extern int MatchCode(
    String n,
    String s,
    String e,
    [MarshalAs(UnmanagedType.LPStr)] out String retorno);

C#DLL使用代碼

String match = String.Empty;

MatchCode(pefi.Nome, String.Empty, String.Empty, out match);

樹的第一個參數是輸入,最后一個是輸出。

我收到此異常:

System.AccessViolationException was unhandled
  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Source=mscorlib
  StackTrace:
       at System.String..ctor(SByte* value)
       at System.StubHelpers.CSTRMarshaler.ConvertToManaged(IntPtr cstr)
       at WFMatchCode.Form1.MatchCode(String n, String s, String e, String& retorno)
       at WFMatchCode.Form1.button1_Click(Object sender, EventArgs e) in C:\Users\computecnica.alexand\Documents\Visual Studio 2010\Projects\WFMatchCode\WFMatchCode\Form1.cs:line 91
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at WFMatchCode.Program.Main() in c:\users\computecnica.alexand\documents\visual studio 2010\Projects\WFMatchCode\WFMatchCode\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
[DllImport( @"Fonetica.dll", CharSet = CharSet.Ansi)]
public static extern int MatchCode(String n, String s, String e, StringBuilder retorno);

然后,您必須傳遞一個StringBuilder,它具有足夠的容量來處理寫入其中的所有內容。 您必須以相同的方式傳遞在C中足夠大的數組:

var capacity = 1000; // change this to whatever you need
var buffer = new StringBuilder(capacity);

var result = MatchCode("test", "test", "test", buffer);

var output = buffer.ToString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM