J'essaye de porter un programme de VB6 à C# qui lit dans un fichier binaire et l'analyse. Je reçois aucune erreur de temps de compilation ou des avertissements mais lorsque je tente de l'exécuter, avant qu'il ne pénètre même Main()
il jette l'exceptionSystem.TypeLoadException: Impossible de charger le type 'x' depuis l'assembly 'y'
System.TypeLoadException was unhandled
Message=Could not load type 'Conversion.DataStructures.ClientOld' from assembly
'SandboxConsole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because
it contains an object field at offset 1 that is incorrectly aligned or overlapped
by a non-object field.
Source=SandboxConsole
TypeName=Conversion.DataStructures.ClientOld
StackTrace:
at sandbox.Program.Main(String[] args)
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:
Voici un exemple de l'ancien code VB6
Private Type SrcClientOld
Active As String * 1 '0
titleLength As Byte '1
title As String * 8 '2
lastNameLength As Byte '10
LastName As String * 25 '11
(...)
AddedBy As String * 3 '369
junk7 As String * 22 '372
End Type '394
Et ici est mon code C# J'ai écrit
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi, Pack = 1)]
struct ClientOld
{
[FieldOffset(0)]
public byte Active;
[FieldOffset(1)]
[MarshalAs(UnmanagedType.AnsiBStr)]
public string Title;
[FieldOffset(10)]
[MarshalAs(UnmanagedType.AnsiBStr)]
public string LastName;
(...)
[FieldOffset(368)]
[MarshalAs(UnmanagedType.AnsiBStr)]
public string AddedBy;
[FieldOffset(372)]
[MarshalAs(UnmanagedType.LPArray, SizeConst = 22)]
public byte[] Unknown7;
}
Après quelques googleing je pensais que c'était que je manque le Pack = 1
, mais en ajoutant que n'a pas résolu mon problème.
D'autres suggestions sur ce qu'il faut faire?
EDIT:
Le premier charater est un octet, voici un vidage hexadécimal du premier enregistrement dans le fichier
A.Dr.......Smith....................
41 03 44 72 2E 00 00 00 00 00 05 53 6D 69 74 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
| | | | ^LastName
| | ^title ^lastNameLength
| ^titleLength
^Active
EDIT2: Changer mon code à ce qui suit pour éliminer toutes les autres erreurs possibles, il me donne toujours la même exception
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi, Pack = 1)]
struct ClientOld
{
[FieldOffset(0)]
public byte Active;
[FieldOffset(1)]
[MarshalAs(UnmanagedType.AnsiBStr)]
public string Title;
}
J'ai essayé à la fois fieldoffset (1) et 2 et aucun ne fonctionne.
Pouvez-vous poster le Len VB6 (SrcClientOld) de la struct? Peut-être avec seulement les deux premiers membres? –
@Marino Šimić Len renvoie 394 pour l'ensemble de la structure pour chaque enregistrement. Dans le code VB6, il enregistrerait tout le bloc de largeur fixe pour l'enregistrement, puis, quand il tirait réellement des données de la structure, il ferait quelque chose comme 'Left (recClient.LastName, recClient.lastNameLength)' –
Hmm, pourquoi déclarez-vous qu'est-ce qui était un type 'String' en tant que' byte' maintenant? Plus précisément, le premier membre de la structure, 'Active'. –