Forum » Programiranje » 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
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
cikopero ::
http://msdn.microsoft.com/en-us/library...
Na žalost sem se s tem primerom že igral, pa sem vedno dobil exeption, varianta nepravilni dll.
cikopero ::
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 ::
cikopero ::
cikopero ::
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:
Vedno dobim napako:
Dll obstaja, ker mi preprost dll na isti lokaciji uspe importat.
Pozkisil sem veliko stvari, to pa je najbližje kar bi lahko delovalo:
Morda kakšen nasvet kako izvesti import?
Hvala,
Peter
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
Lp,
Peter
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | kako narediti program ki bere drugi programOddelek: Programiranje | 5726 (4039) | imagodei |
» | null reference exception na čudnem mestu C#Oddelek: Programiranje | 1296 (1233) | krho |
» | uporaba C++ unmanaged kode v C#.NET projektuOddelek: Programiranje | 1892 (1615) | krho |
» | [C#] Sesutje aplikacijeOddelek: Programiranje | 1612 (1447) | Jean-Paul |
» | [C#] unmanaged->managed codeOddelek: Programiranje | 2136 (2011) | Zzzzzzz |