VB of C++ DLL als Late Binding in C#

Pagina: 1
Acties:
  • 582 views

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit met het volgende probleem. Wanneer ik een DLL dat geschreven is in C# in een class toevoegd via late binding heb ik geen probleem.

C#:
1
2
3
String DLLpath = @"C:\File.dll";

Assembly assembly = Assembly.LoadFile(DLLpath);


Ik kan door het toevoegen van de DLL als hierboven alle methodes gebruiken van de DLL.

Wanneer de DLL nou gemaakt is in VB of in C++ gaat het mis. Ik krijg dan de volgende exception error:

Could not load file or assembly 'file:///<file path>' or one of its dependencies. The module was expected to contain an assembly manifest.

Hoe krijg ik het voor elkaar dat de VB/C++ DLL ingeladen kan worden in Visual Studio 2008 (C#)?

*Ik heb met Assembly.Load/LoadFile/LoadFrom geprobeerd de VB/C++ Dll in te laden, helaas zonder resultaat.
*De oplossingen die ik op google gevonden heb zijn bedoeld voor DLL's die gemaakt zijn in C#.

Alvast bedankt! :)

[ Voor 13% gewijzigd door Verwijderd op 11-01-2010 13:44 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het ligt er een beetje aan wat voor DLL je wilt inladen? is het een Com server component, of is het een DLL die je via PInvoke aan wil roepen?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Je verwart bepaalde dingen. De manier waarop jij nu je dll wilt inladen is via Reflection. Zo kan je een CLR dll inlezen.

Maar een C++ dll absoluut niet. Daarvoor moet je dll import gebruiken :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja dat heb ik idd al gedaan, anders had ik niet om advies gevraagd?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 11 januari 2010 @ 13:32:
ja dat heb ik idd al gedaan, anders had ik niet om advies gevraagd?
Waarom meld je dat dan niet in je topicstart (zie onze Quickstart)? En wat werkte daar niet aan? Wat was er wel/niet van toepassing? Welke oplossingen van de gevonden zaken heb je geprobeerd en waarom werkten die volgens jou niet?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Snake, dit gaat dan ook niet op mt VB?

Ik heb een stuk code in VB waar er een object van een dll (VB) wordt gemaakt:

C#:
1
Set object= CreateObject("DLLnaam.class")


daarna worden er verschillende variablen gezet:

C#:
1
2
3
object.variable1 = "waarde";
object.variable2 = true;
enz..


Deze code wil ik omzetten naar C#, maar dan krijg ik dus het probleem dat ik de DLL niet in kan laden.
Kan dit dan ook makkelijk en overzichtelijk gedaan worden met DLL import (variablen zetten)?

[ Voor 12% gewijzigd door Verwijderd op 11-01-2010 13:46 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dan moet je je eens in gaan lezen in COM Interop in het .NET framework. Dit is namenlijk geen native of managed dll!

[ Voor 9% gewijzigd door Woy op 11-01-2010 14:39 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Verwijderd schreef op maandag 11 januari 2010 @ 13:40:
Snake, dit gaat dan ook niet op mt VB?

Ik heb een stuk code in VB waar er een object van een dll (VB) wordt gemaakt:

C#:
1
Set object= CreateObject("DLLnaam.class")
Dat kan alleen als het een COM dll is.

[edit]
laat

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thnx voor alle input.

Het gaat om een com dll. dus het moet gaan dan, zoals jullie zeggen.
alleen is de vraag hoe? in vb gaat dit dus makkelijk met createObject en verwijsnaar de dl., maar in C# heb ik geen idee hoe.

Ik dacht dat het inladen met Assembly.LoadFile(DLLpath) wel zou gaan werken maar helaas.
Of het gaat met de DllImport weet ik niet, want het gaat niet om methodes aanroepen uit de dll maar om variablen te setten.

als iemand mij in een goeie richting kan sturen graag, i'm lost..

Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

MSDN heeft hier mooie artikels over, direct gevonden met "import external dll" op msdn in te geven ;)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Boeboe schreef op maandag 11 januari 2010 @ 15:47:
MSDN heeft hier mooie artikels over, direct gevonden met "import external dll" op msdn in te geven ;)
dit voorbeeld is bedoeld voor C++, maar ik heb C# nodig. het gaat om een dll in C++ maar die moet worden ingeladen in C# met late binding.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Nu online

Haan

dotnetter

Verwijderd schreef op maandag 11 januari 2010 @ 16:03:
[...]
dit voorbeeld is bedoeld voor C++, maar ik heb C# nodig. het gaat om een dll in C++ maar die moet worden ingeladen in C# met late binding.
Hoezo bedoeld voor C++, het is de C# reference.. (Al is de Net 3.5 versie misschien wat duidelijker.

Wat bedoel je trouwens met
Of het gaat met de DllImport weet ik niet, want het gaat niet om methodes aanroepen uit de dll maar om variablen te setten.
Je wilt variabelen in de dll setten? Zijn daar dan geen set-functies voor in de dll?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Verwijderd schreef op maandag 11 januari 2010 @ 16:03:
[...]


dit voorbeeld is bedoeld voor C++, maar ik heb C# nodig. het gaat om een dll in C++ maar die moet worden ingeladen in C# met late binding.
Het voorbeeld op die pagina laat toch echt C# code zien? En anders heb je deze nog: http://msdn.microsoft.com.../aa645736%28VS.71%29.aspx , als je dll COM+ implementeert.

Sundown Circus


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op maandag 11 januari 2010 @ 16:16:

Wat bedoel je trouwens met
[...]

Je wilt variabelen in de dll setten? Zijn daar dan geen set-functies voor in de dll?
Ik heb op dit moment een stuk code in VB waar er een object wordt gemaakt door late binding en vervolgens worden de variabelen toegewezen van het object. zoals hier:

C#:
1
2
3
4
5
Set object= CreateObject("DLLnaam.class")

object.variable1 = "waarde"; 
object.variable2 = true; 
enz..


de dll is C++ en is gemaakt en heb ik geen source van verder, alleen de documentatie van de methodes en variables die gezegt worden.

[ Voor 11% gewijzigd door Verwijderd op 11-01-2010 16:23 ]


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Dan stel ik je toch echt voor om mijn link eens beter te bekijken want die bevat echt wel hetgene jij nodig hebt. Toegegeven, het ondersteunt geen late binding (afaik, heb ik eigenlijk geen ervaring mee), maar je kan er wel c++ dll's volledig mee aanspreken.

[ Voor 16% gewijzigd door boe2 op 11-01-2010 17:06 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Boeboe, hoe krijg ik op die manier de class name mee?

De manier waar je me na toewijst heb ik gebruikt bij:

Visual Basic:
1
Declare Function <MethodName> Lib "DLLname" (parameters) As 


Maar om op de DLLimport manier een class name mee te geven is mij niet duidelijk en zie ik ook niet terug in de voorbeelden. Op dit moment is het zo als ik mijn DLL importeer op de DLLimport manier vind hij de Methode niet, dit omdat hij niet in de goeie class zoekt van de C++ dll

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Native C++ DLL's gebruiken een mangling-schema waardoor classnamen en functies worde gecodeerd zodat ze een unieke naam hebben (een eis voor symbolen in een DLL).

Gebruik eens een tool (depends.exe bijvoorbeeld) om te kijken welke functies geexporteerd worden vanuit de betreffende DLL, en met welke naam (je kan ook namen demanglen met depends.exe).

Aan de hand van die informatie kan je zien hoe je kan importeren in een C# applicatie.

-niks-


Acties:
  • 0 Henk 'm!

Verwijderd

Activator.CreateInstance?

Daar kan je wel het één en ander mee doen denk ik.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 11 januari 2010 @ 15:00:
thnx voor alle input.

Het gaat om een com dll. dus het moet gaan dan, zoals jullie zeggen.
alleen is de vraag hoe? in vb gaat dit dus makkelijk met createObject en verwijsnaar de dl., maar in C# heb ik geen idee hoe.
Sorry hoor, maar we verwachten wel iets meer inzet van jezelf. Ik heb al duidelijk een keyword gegeven ( Com Interop ), en daar moet je perfect zelf genoeg mee kunnen vinden.

http://www.google.nl/sear...=late+binding+com+interop en daar de 2e link

Het is niet de bedoeling dat we je hier kant en klaar uit gaan leggen hoe je dit voor elkaar moet krijgen, zonder dat je zelf ook maar enig zoekwerk verricht.

Verder kun je gewoon in visual studio al een COM Wrapper laten genereren, als je gewoon een refference toevoegt naar een COM Component. Die wrapper kun je dan eventueel met Assembly.LoadXXX dynamisch laden.

[ Voor 12% gewijzigd door Woy op 11-01-2010 20:33 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1

Dit topic is gesloten.