je convertir une fonction de Visual Basic 6.0 comme:La conversion d'une fonction à partir de Visual Basic 6.0 à C# est de lancer AccessViolationException
Declare Function RequestOperation Lib "archivedll" (ByVal dth As Long, ByVal searchRequestBuf As String, ByVal buflen As Long, ByVal FieldNum As Long, ByVal OP As Long, ByVal value As String) As Long
En C#, je suis déclarer la fonction comme:
[DllImport("archivedll")]
public static extern int RequestOperation(int dth ,StringBuilder searchRequestBuf, int bufferLen, int fieldNum, int op, string value);
lorsque l'appel RequestOperation de C#, il jette une exception:
[System.AccessViolationException] = {"Tentative de lecture ou d'écriture de la mémoire protégée . Ceci est souvent une indication qu'une autre mémoire est corrompu. "}
J'ai réussi à appeler beaucoup d'autres fonctions comme celle-ci, mais seulement cette fonction génère l'exception.
Oui j'initialiser le StringBuilder avec capicity = 4096 code VB6 appeler Dim bufSearchRequest As String * 4096 RETCODE = SearchRequestOperation (hDocumentType, bufSearchRequest, Len (bufSearchRequest), fieldIdx, querytype, stringQuery) et ce est l'appel C# StringBuilder searchRequest = new StringBuilder (4096); retCode = RequestOperation (hDocumentType, searchRequest, searchRequest.Capacity, index, type de requête, requête); –
Comme le dit Eran, l'erreur se produit clairement parce que vous passez un objet StringBuilder dans une fonction qui attend une chaîne. Ils ne sont pas interchangeables. –
Eran est incorrect. La DLL renvoie une chaîne via l'argument searchRequestBuf. Par conséquent, StringBuilder doit être utilisé. La chaîne ne peut être utilisée que si la DLL ne modifie pas la chaîne d'entrée. Voir par exemple ici. http://msdn.microsoft.com/en-us/library/ms235282(VS.80).aspx – MarkJ