C# Wrapperumstellung .Net 2.0 auf .Net 4.6.2 macht Probleme

ZeroSharp

Newbie
Registriert
Aug. 2017
Beiträge
2
Hallo Zusammen,

ich bin dabei einen Wrapper für Bildfunktionen und Konvertierungen umzustellen. Also bisher .Net 2.0 soll nun für .Net 4.6.2 migriert werden. Bisher lief alles prima und nun hänge ich an einer Funktion die umgestellt werden muss, um kompilierungsfähig zu sein.

Alte Version .Net 2.0:
Code:
[DllImport("imageapi.dll", CharSet=CharSet.None, ExactSpelling=false)]
private static extern unsafe int getImage(int InputDPI, int OutputDPI, int pBlk, int pWht, double Gamma, int Sharpening, string InputFormat, byte* InputImage, UIntPtr InputImageSize, string OutputFormat, int AllocatedOutputImageSize, IntPtr* OutputImage, int* OutputImageSize);


 public byte[] GetImage(int inputDPI, int outputDPI, int pBlk, int pWht, double gamma, int sharpening, string inputFormat, byte[] inputImage, string outputFormat)
        {
            unsafe
            {
                IntPtr intPtr = default(IntPtr);
                byte* numPointer;
                int num = 0;
                byte[] numArray = null;
                int num1 = 0;
                byte[] numArray1 = inputImage;
                byte[] numArray2 = numArray1;
                if (numArray1 == null || (int)numArray2.Length == 0)
                {
                    numPointer = null;
                }
                else
                {
                    numPointer = &numArray2[0];
                }
                UIntPtr uIntPtr = new UIntPtr((uint)inputImage.Length);
                num = Print.getImage(inputDPI, outputDPI, pBlk, pWht, gamma, sharpening, inputFormat, numPointer, uIntPtr, outputFormat, 0, ref intPtr, ref num1);
                numPointer = null;
                if (num != 0)
                {
                    Trace.WriteLine(string.Concat("Print - GetImage: ", num.ToString()));
                    throw new PrintException(num, string.Concat("Print - GetImage: ", num.ToString()));
                }
                numArray = new byte[num1];
                Marshal.Copy(intPtr, numArray, 0, num1);
                Print.FreeImage(ref intPtr);
                return numArray;
            }
        }

Wegen der ref Anweisungen bei den Parametern der Funktion Print.getImage ref intPtr, ref num1 und Print.FreeImage ref intPtr ist eine Kompilierung unter .Net 4.6.2 nicht mehr möglich. Also habe ich bei den besagten Stellen ref gegen & ersetzt. Eine Kompilierung ist möglich aber führt nun zum Fehler: "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."

Hat Jemand eine Idee, wie die Migration auf .Net 4.6.2 aussehen muss?

Vielen Danke
 
Bist du Sicher, das die Signatur von der externen Funktion korrekt ist?
Vor allem für welche Platform kompilierst du? x64 oder x86?

Bei x64 ist IntPtr, sowie UIntPtr 64-bit groß, bei x86 dagegen nur 32-bit - wenn nun die Funktion in der DLL die Parameter die du mit IntPtr angegeben hast aber int32 erwarten, dann wird das korrekter weise dir um die Ohren fliegen.
 
Danke für den Hinweis. Ich kompiliere für x86 und die native Funktion
ist ebenfalls eine x86 dll.

Aber ich konnte das Problem lösen.
Ich habe den ImagePointer mit fixed gepinnt.

Nun funktioniert das im Dauertest auch wieder...

VG
 
Zurück
Oben