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.
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
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()
arne_v Ekspert
31. august 2016 - 14:59 #3
array<Byte> er en managed type, saa du maa kunne bruge Length property.

b->Length
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.
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..
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 ---
keepy Seniormester
01. september 2016 - 08:37 #7
Tak Arne jeg fik det til at spille
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

Opret Preview

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





Computerworld
Bitcoinen nåede lige at kulminere igen – men så kom krakket
Der blev sat en ny rekord for bitcoinens værdi i år – men godt 24 timer efter blev der høvlet næsten 20.000 kroner af den.
CIO
Podcast: Her er seks gode råd om ledelse og digitalisering fra danske top-CIO'er
The Digital Edge: Vi har talt med 17 af Danmarks dygtigste digitale ledere - og samlet deres seks bedste råd om digitalisering og ledelse. Få alle rådene på 26 minutter i denne episode af podcasten The Digital Edge.
Job & Karriere
Se Waoos forklaring: Derfor har selskabet fyret topchef Jørgen Stensgaard med omgående virkning
Waaos bestyrelse opsiger fiberselskabets topchef, Jørgen Stensgaard, der fratræder med omgående virkning. Se hele forklaringen fra Waao her.
White paper
Overser du muligheder for at optimere din Dynamics-investering?
Der er omfattende og ofte oversete muligheder for at understøtte centrale forretningsprocesser med Dynamics 365 Finance & Operations. For eksempel i form af fuld EDI-integration, som optimerer logistik og forsyning. Eller ved at automatisere håndteringen af konsignation eller centrale processer vedrørende elektronisk dokumentflow og dropshipping. Læs mere i dette whitepaper, der også går i dybden med fire konkrete cases.