Avatar billede keepy Seniormester
29. august 2016 - 11:07 Der er 6 kommentarer og
1 løsning

Kald af C# com dll fra C++

Hej
Jeg har en C# COM dll jeg gerne vil kalde fra et c++ program.
Den methode i C# dll'en jeg ønsker at bruge tager en byte[] som parametere og retuner ligeledes et byte[].

Er der nogle der kan skubbe mig i den rigtige retning og gerne med et god eksempel.

Mange tak.
Avatar billede arne_v Ekspert
29. august 2016 - 14:49 #1
Jeg antager at det er native C++ ikke C++/CLR.

native C++ -> C# er noget vanskeligere end C# -> native C++.

Der er flere maader at gribe det du vil an paa.

Den bedste i dit tilfaelde vil jeg tro er:

din native C++ kode -> noget nyt mixed mode C++ -> din C# kode
Avatar billede keepy Seniormester
31. august 2016 - 14:41 #2
Ved du hvordan jeg finder længden af et c++ array<Byte>^ b
Jeg kan ikke bruge sizeof()
Avatar billede arne_v Ekspert
31. august 2016 - 14:59 #3
array<Byte> er en managed type, saa du maa kunne bruge Length property.

b->Length
Avatar billede keepy Seniormester
31. august 2016 - 15:34 #4
Her prøver jeg at finde length på unsigned char* value
int length = strlen((const char*)value);
Det har virket men du virker det ikke mere, har du et tip her også ??

tak for svarene indtil nu.
Avatar billede arne_v Ekspert
31. august 2016 - 16:19 #5
Det virker *hvis* value indeholder 8 bit chars og er nul termineret.

Det virker ikke hvis det er binaere data, unicode chars, ikke er nul terminaeret etc..
Avatar billede arne_v Ekspert
01. september 2016 - 03:08 #6
Du maa godt se hvor langt jeg naaede.

C# kode:


using System;

namespace DemoNamespace
{
    public class DemoClass
    {
        public static byte[] DemoMethod(byte[] a)
        {
            byte[] res = new byte[a.Length];
            for(int i = 0; i < res.Length; i++) {
                res[i] = (byte)(res[i] + 1);
            }
            return res;
        }
    }
}


C++ kode:


#include <iostream>

using namespace std;

unsigned char* demo_method(unsigned char *a, int len);

int main()
{
    unsigned char a[] = { 1, 2, 3 };
    unsigned char* a2 = demo_method(a, 3);
    cout << a2[0] << " " << a2[1] << " " << a2[2] << endl;
    return 0;
}


C++ glue kode:


#using <mscorlib.dll>

#using <demo.dll>

using namespace System;
using namespace System::Runtime::InteropServices;

unsigned char* demo_method(unsigned char *a, int len)
{
    array<Byte>^ a2 = gcnew array<Byte>(len);
    Marshal::Copy((IntPtr)a, a2, 0, len);
    array<Byte>^ res2 = DemoNamespace::DemoClass::DemoMethod(a2);
    unsigned char* res = new unsigned char[len];
    Marshal::Copy(res2, 0, (IntPtr)res, len);
    return res;
}


men det crasher!

:-(

Unhandled Exception: System.TypeInitializationException: The type initializer fo
r '<Module>' threw an exception. ---> System.AccessViolationException: Attempted
to read or write protected memory. This is often an indication that other memor
y is corrupt.
  at _initterm_e((fnptr)* pfbegin, (fnptr)* pfend)
  at <CrtImplementationDetails>.LanguageSupport.InitializeNative(LanguageSuppor
t* )
  at <CrtImplementationDetails>.LanguageSupport._Initialize(LanguageSupport* )
  at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
  at .cctor()
  --- End of inner exception stack trace ---
Avatar billede keepy Seniormester
01. september 2016 - 08:37 #7
Tak Arne jeg fik det til at spille
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester