2011-08-12 5 views
2

dllは、デルファイで書かれたマニュアルに従って、まずxmlパスをSET_XML()で設定してから、好きな関数を使用する必要があります。マニュアルに従ってdll C#AccessViolationException


Delphiの機能:マニュアルに従ってVBで

function SET_XML(var path: PAnsiChar): LongInt; 
function GET_CALCULATION_FAN_ALONE(var fanDescription: PAnsiChar): LongInt; 

が使用:

Public Declare Function SET_XML_PATH Lib "fan.dll" (ByRef path As String) As Long 
Public Declare Function GET_CALCULATION_FAN_ALONE Lib "fan.dll" (ByRef path As String) As Long 

Sub Main() 
    Dim a As Long, b As Long, Str_Result As String, Str_Input As String 
    Str_Input = "C:\Users\Sebastiaan\Documents\Visual Studio 2010\Projects\Lucam selectie\Lucam selectie\bin" 
    a = SET_XML_PATH(Str_Input) 
    Str_Result = "65464;;;1,2;;23;424,8;0,3766;;" 
    b = GET_CALCULATION_FAN_ALONE(Str_Result) 
End Sub 

ドを実行しているとき、私はC#

const string _dllLocation = "EbmPapstFan.dll"; 

[DllImport(_dllLocation)] 
public static extern long SET_XML_PATH(ref String path); 

[DllImport(_dllLocation)] 
public static extern long GET_CALCULATION_FAN_ALONE(ref String fanDescription); 

public Main() 
{ 
    String path = @"C:\Users\Sebastiaan\Documents\Visual Studio 2010\Projects\Lucam selectie\Lucam selectie\bin"; 
    long a = SET_XML_PATH(ref path); 

    String fanDescription = "65464;;;1,2;;23;424,8;0,3766;;"; 
    long c = GET_CALCULATION_FAN_ALONE(ref fanDescription); 
} 

をそれを書き直しました私はAccessViolationExceptionを取得するアプリケーション

保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。

ブレークポイントを設定し、コードを段階的にデバッグする場合は、何もすべてうまくいかない。時々私はデバッグモードでエラーが発生しました( "long c = GET_CALU ...")

私は間違っていますか?

+0

私はよく分からないが、私はこのエラーを見たとき、私はいつも(System.Diagnostics.Process.EnterDebugModeを考えています)。 – Cynede

答えて

3

私はDelphiをC#から呼び出すのに慣れていませんが、クイック検索では呼び出し規約にいくつかの問題があるように見えます(値はスタックからどのようにプッシュおよびポップされるか)。これらのスレッドを参照してください。これらのことから

Calling a Delphi DLL from C# produces unexpected results

Calling a delphi DLL method from C# Code

、直接原因呼び出し規約「fastcall」にこれを呼び出すことができない場合がありますように聞こえます。呼び出し規約を変更すると、簡単なテストの価値があります。このページを参照してください:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx

問題が解決しない場合、私はおそらくちょうどデルファイDLLを呼び出すCラッパーDLLを書き、作品は(それだけでDLLのバグではないことを確認していることを確認します)。そうであれば、ラッパーDLLの関数でDllImportを使用して、C#プログラムからC DLLを呼び出すことができます。

ビットを役に立てば幸い、

ジョン

+0

はStdCallを試しましたが、同じエラーが発生しました。ラッパーを書き込もうとしていますが、動作している場合はお知らせします – Sebastiaan

関連する問題