» »

Dll napisan v C++ importan v C# aplikacijo

Dll napisan v C++ importan v C# aplikacijo

cikopero ::

Pozdravljeni,

Imam sledeči problem in ne vem več, kako se bi ga lotil. Vse naslednje navedeno se programira v Visual studiu 2005.

Imam lep primer napisan v C++ (tip projekta: win32 napisan v c datoteki - uporabljeno #include in ne using). Ker je primer zelo lepo napisan in tudi zahteven, sem želel ta primer pretvoriti v dll, ter ga nato uporabiti v aplikaciji oz kasneje v dll, ki je napisan v C#.

Zakaj vse ne napišem vse v C++?
Ker imam več znanja o C# in tudi končna aplikacija, katera potrebuje dll, je pisana v C# ter imam primer, kako mora izgledati dll (napisan v C#). Torej s strani končne aplikacije sem obsojen na C#.

Zakaj torej ne vse v C#?
Kot sem že omenil je primer zelo lepo napisan in vsebuje že ves avtomatizem, kar je pa najbolj pomembno, narejen je celoten import glavnega dll-ja.

Sam sem poizkusil narediti preprost Dll napisan v C++ (tip win32 z c datoteko in ne class), ter ga nata importat v C# aplikacijo, vendar mi ni uspelo.

Ali ima morda kdo kakšen primer (solution), za C++ dll in C# aplikacijo, ki uporabi ta Dll? Rad bi le preprost primer, na kateremu bi lahko začel graditi.

Hvala,
Peter

Hvala,
Lep pozdrav

Tr0n ::

cikopero ::

Tr0n je izjavil:

http://msdn.microsoft.com/en-us/library...


Na žalost sem se s tem primerom že igral, pa sem vedno dobil exeption, varianta nepravilni dll.

Tr0n ::

Kaksen exception tocno in kaj pravi dokumentacija za ta exception?

cikopero ::

Tr0n je izjavil:

Kaksen exception tocno in kaj pravi dokumentacija za ta exception?


Napaka:
Prišlo je do poskusa nalaganja programa z napačno obliko zapisa. (Exception from HRESULT: 0x8007000B)

Imam po čist preprost primer:

C#:
internal const string DllName = "C++ dll1.dll";

        [DllImport(DllName)]
        internal static extern double Add(double a, double b);


        private void button1_Click(object sender, EventArgs e)
        {

            double ab = Add(10, 20);

            MessageBox.Show(ab.ToString());


        }


Koda dll-ja sledi kasneje...

Tr0n ::

DLL ima malce cudno ime (znaka + in presledek). Mozno tudi, da se razlikuje platforma (x86 vs. x64).

cikopero ::

Tr0n je izjavil:

DLL ima malce cudno ime (znaka + in presledek). Mozno tudi, da se razlikuje platforma (x86 vs. x64).


Ok, že napredujem, prva težava je bila v platformi, sedaj je pa napaka:
Unable to find an entry point named 'Add' in DLL 'Cdll.dll'.

Tr0n ::

Malce pogooglaj.

cikopero ::

Tr0n je izjavil:

Malce pogooglaj.


Hvala za enkrat. Žal nimam oba sourca pri sebi, tako da ne morem narediti testa.
En korak sem že bližje :D.

Se bomo zvečer poigrali..

Peter

cikopero ::

cikopero je izjavil:

Tr0n je izjavil:

Malce pogooglaj.


Hvala za enkrat. Žal nimam oba sourca pri sebi, tako da ne morem narediti testa.
En korak sem že bližje :D.

Se bomo zvečer poigrali..

Peter


Lep primer se nahaja na:
http://forums.asp.net/t/1320557.aspx

Lp

cikopero ::

Pozdravljeni,

poizkušam v C# importat dll, vendar mi nikakor ne uspe.

V dokumentaciji dll-ja je navedena funkcija:

QS_RESULT QS_InitializeOnce (
const char *pszWorkingDirectoryName,
const char *pszCallerDescription
);


Vedno dobim napako:

Unable to load DLL 'Test.dll': Navedenega modula ni bilo mogoče najti. (Exception from HRESULT: 0x8007007E)


Dll obstaja, ker mi preprost dll na isti lokaciji uspe importat.

Pozkisil sem veliko stvari, to pa je najbližje kar bi lahko delovalo:
[DllImport(@"Test.dll", EntryPoint = "QS_InitializeOnce")]
public extern static QS_RESULT QS_InitializeOnce(IntPtr pszWorkingDirectoryName, IntPtr pszCallerDescription);

private void button2_Click(object sender, EventArgs e)
{

    ASCIIEncoding  encoding = new ASCIIEncoding();
    string mystring = "C:\\TEST\\Bin";
    byte[] byteArray = encoding.GetBytes(mystring);

    string mystring1 = "Peter TEST";
    byte[] byteArray1 = encoding.GetBytes(mystring1);


    GCHandle pinnedArray = GCHandle.Alloc(byteArray, GCHandleType.Pinned);
    IntPtr pointer = pinnedArray.AddrOfPinnedObject();

    GCHandle pinnedArray1 = GCHandle.Alloc(byteArray, GCHandleType.Pinned);
    IntPtr pointer1 = pinnedArray1.AddrOfPinnedObject();
    

    QS_RESULT retInit = QS_RESULT.QS_UNSUPPORTED;
    retInit = QS_InitializeOnce(pointer, pointer1);
    MessageBox.Show(retInit.ToString());

    pinnedArray.Free();
    pinnedArray1.Free();
}


Morda kakšen nasvet kako izvesti import?

Hvala,
Peter

cikopero ::

Ta težava je odpravljena, očitno TEST.DLL importa še svoje dllje. Ko sem poizkusil zagnati program med vsemi dllji se je pojavil vsaj druga napaka.

Lp,
Peter

cikopero je izjavil:

Pozdravljeni,

poizkušam v C# importat dll, vendar mi nikakor ne uspe.

V dokumentaciji dll-ja je navedena funkcija:

QS_RESULT QS_InitializeOnce (
const char *pszWorkingDirectoryName,
const char *pszCallerDescription
);


Vedno dobim napako:

Unable to load DLL 'Test.dll': Navedenega modula ni bilo mogoče najti. (Exception from HRESULT: 0x8007007E)


Dll obstaja, ker mi preprost dll na isti lokaciji uspe importat.

Pozkisil sem veliko stvari, to pa je najbližje kar bi lahko delovalo:

[DllImport(@"Test.dll", EntryPoint = "QS_InitializeOnce")]
public extern static QS_RESULT QS_InitializeOnce(IntPtr pszWorkingDirectoryName, IntPtr pszCallerDescription);

private void button2_Click(object sender, EventArgs e)
{

ASCIIEncoding encoding = new ASCIIEncoding();
string mystring = "C:\\TEST\\Bin";
byte[] byteArray = encoding.GetBytes(mystring);

string mystring1 = "Peter TEST";
byte[] byteArray1 = encoding.GetBytes(mystring1);


GCHandle pinnedArray = GCHandle.Alloc(byteArray, GCHandleType.Pinned);
IntPtr pointer = pinnedArray.AddrOfPinnedObject();

GCHandle pinnedArray1 = GCHandle.Alloc(byteArray, GCHandleType.Pinned);
IntPtr pointer1 = pinnedArray1.AddrOfPinnedObject();


QS_RESULT retInit = QS_RESULT.QS_UNSUPPORTED;
retInit = QS_InitializeOnce(pointer, pointer1);
MessageBox.Show(retInit.ToString());

pinnedArray.Free();
pinnedArray1.Free();
}


Morda kakšen nasvet kako izvesti import?

Hvala,
Peter


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465726 (4039) imagodei
»

null reference exception na čudnem mestu C#

Oddelek: Programiranje
51296 (1233) krho
»

uporaba C++ unmanaged kode v C#.NET projektu

Oddelek: Programiranje
111892 (1615) krho
»

[C#] Sesutje aplikacije

Oddelek: Programiranje
111612 (1447) Jean-Paul
»

[C#] unmanaged->managed code

Oddelek: Programiranje
112136 (2011) Zzzzzzz

Več podobnih tem