Hej Du gör en marshal från en char till en array!? Hej Låter konstigt att det funkade så där i vb.net .. men å andra sidan så är vb.net väldigt förlåtande, och oerhört dålig på att enforca saker .. Förutom det Patrik har sagt (ändra char till char[]) så undrar jag om inte SECURE_TYPE paramtern ska vara deklarerard som ref. Hej, när du anropar metoden så måste du också ange refOutOfMemoryException
Har ett problem med ett C# Class Library jag håller på med. Jag får OutofMemoryexception. Tänkte höra om någon har tips på vad det kan vara...
Raden som genererar felet är,
cscons(out RC, out ConvId,SecurInfo,ConnTimeOut,SenderTag,Partner,Initiator);
cscons definition
[DllImport("vcomcl32.dll")]
public static extern short cscons(out short RC, out CONVID_TYPE ConvId, SECURE_TYPE SecInfo, int TimeOut, string Sendertag, string Partner, string Initiator);
Secure_type definition
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct SECURE_TYPE // Security information
{
public int Len; // Length of data area
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=99)]
public string Data; // Data area
}
Convid_type definition
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct CONVID_TYPE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public char NetName; // Network name of initiator
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public char NodeName; // Node name of initiator
[MarshalAs(UnmanagedType.ByValArray, SizeConst=14)]
public char SessionId; // Timestamp (YYYYMMDDhhmmss)
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]<
public char SeqNr; // Sequence number
}
Övriga definition
public short RC;
public int ConnTimeOut = 10;
public string SenderTag = "GENINT";
public string Partner;
public string Initiator = "GENINT";
Innan jag anropar cscons anropar jag två liknande anrop mot samma dll som fungerar. Dessa två innehåller dock inte Secure_type och Convid_type, misstänker att dessa ställer till problemet. Det finns inga minnes problem på maskinen.
Tips mottages tacksamt
//RogerSv: OutOfMemoryException
Det borde inte funka, får du en array tillbaka från unmanaged kod, så vinns det definivt inte plats nog att lagra en array av ngt.
Ska det vara en array där? Hur ser C++ definitionen av structen ut?Sv: OutOfMemoryException
Koden är ursprungligen från VB.NET där den fungerar utmärkt. Med detta vill jag dock inte på något sätt säga att den borde göra det här, men det kanske kan vara bra att veta?!
Jag har hittat structen för C och den ser ut på detta sätt... Kan tillägga också att efter ytterligare felsökning så är det helt klart (99%) att det är detta som ställer till problemet!
//Roger
/*
* CSID - Conversation ID
*/
#ifndef CSID_H
#define CSID_H
struct csid
{
char id[34];
};
typedef struct csid CSID;
#endifSv: OutOfMemoryException
Jag hävdar fortfarande att du inte kan kasta om en char i .net till en ref array i unmamaged world, låter helt vansinnigt .. Prova char[] istället ..
structen du skickade ser dessutom inte alls ut som de två du definerat i din kod?Sv: OutOfMemoryException
..., out CONVID_TYPE ConvId, ref SECURE_TYPE SecInfo, int TimeOut, ...
MSSv: OutOfMemoryException
Semester gjorde att det tog ett tag innan jag hade möjlighet att svara. Har testat både det Patrik skrivit och lagt till ref enligt ovan. Men ingen framgång fick följande fel när jag lägger till ref...
Argument '3': cannot convert from 'Vcom.SECURE_TYPE' to 'ref Vcom.SECURE_TYPE'
Har givit upp, Den del får vara kvar i VB.NET så skriver jag om resterande del av programmet i C#... tackar för hjälpen i alla fall.
RogerSv: OutOfMemoryException
dvs
public void mymethod(ref object o)
{}
anrop
object o = whaever;
mymethod(ref o);