Toon posts:

[.NET] schrijven naar hardware

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

op het moment gebruik ik een dll vanuit vb6 die de layer verzorgt om te schrijven naar een hardware kaart in mijn computer, het gaat om een ISA kaart die wordt gebruikt om een singaal over een XLR kabel te sturen. Onder vb6 heb ik dan weer een reference naar een DLL die hardware i/o kan doen, het vb6 gedeelte regelt het initialiseren van de kaart, uploaden van het besturing systeempje,etc... maar de vraag is echter of ik dit allemaal niet gewoon in .NET kan doen? als ik dan gewoon hardware i/o kan doen, is het probleem opgelost. Iemand een idee?

Alvast bedankt,
Martin

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Ik vermoed dat dit uitsluitend met een 'traditionele' device driver kan. Verder denk ik niet dat er een geschikt .NET taaltje is (dat fatsoenlijk met pointers en geheugen om kan gaan, bijvoorbeeld, of met de C-API van Windows kan communiceren) om een device driver mee te schrijven. Ik denk dat je dus aangewezen bent op C. Maar dat is puur gebaseerd op een globaal idee van hoe Windows werkt en niet op gedegen kennis van de mogelijkheden van .NET ;).

edit:
Sorry, ik las verkeerd... je hebt al een device driver die het schrijven kan doen, maar je wilt een native DLL benaderen vanuit .NET. Tenzij die DLL een .NET-library is, kun je die niet vanuit managed code benaderen.

[ Voor 43% gewijzigd door Soultaker op 18-07-2003 12:37 ]


Verwijderd

dlportio of winio gebruiken, je moet alleen de vb6 declaraties even naar .net datatypen omzetten.

Verwijderd

Topicstarter
precies dus het probleem wat SoulTaker zegt, ik kan die dll niet direct benaderen vanuit dotNET, daarom heb ik eerst een dll in vb6 gemaakt, die hem wel kan benaderen, en nog wat andere functies die direct in verband staan met de kaart, en die dll kan ik dan weer wel vanuit .net benaderen, beetje een omweg dus, maar zoals jullie dus zeggen zou ik dit dus wel vanuit C++.NET kunnen doen? En dan kan ik daar weer een assembly van maken, en zou het dus moeten werken?

[ Voor 75% gewijzigd door Verwijderd op 18-07-2003 13:03 . Reden: ff opnieuw ]


Verwijderd

Topicstarter
winio werkt alleen onder win9x

Verwijderd

Aannames:
Je dll benader je met WINAPI calls
Je gebruikt C# of C++.Net

Dan kun je met de DllImport attribute direct calls maken naar een dll.

Voorbeeldje:

C#:
1
2
3
4
5
6
7
8
9
10
using System.Runtime.InteropServices
class MsgBoxTest {
    [DllImport("user32.dll")]
    static extern int MessageBox(int hWnd, string text, string caption, int type);

    public static void Main() {
        MessageBox(0, "Hello world", "Hello", 0);
    }

}


Edit: werkt ook met VB.Net.

[ Voor 8% gewijzigd door Verwijderd op 18-07-2003 16:26 ]


Verwijderd

Topicstarter
mijn eigen dll werkt ook prima, dlportio werkt dus niet direct vanuit .NET, dus de vraag is, kan ik niet via C++.NET een assembly schrijven die direct naar de I/O schrijft?

Verwijderd

Zoals flipje501 aangeeft kun j functies van een willekeurige dll (dus ook jouw dll) aanroepen via platform invoke. Er is wel een restrictie: je kunt alleen functies van de dll aanroepen, de dll kan geen functies van jouw aanroepen. Een andere restrictie is dat je de signature van je functie moet weten (en in je code vermelden) en dat is met vb-functies misschien wat lastig te achterhalen?

Verwijderd

Topicstarter
mhmm dat is dus nog steeds niet het probleem, alles wat ik dus wil is de dll die ik nu heb die naar hardware schrijft, gewoon herschrijven, en dat gaat dus niet in VB.NET omdat die managed is, dus was de vraag of dit dan te doen is in C++.net, oftewel unmanaged c++

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Verwijderd schreef op 19 juli 2003 @ 18:32:
en dat gaat dus niet in VB.NET omdat die managed is, dus was de vraag of dit dan te doen is in C++.net, oftewel unmanaged c++
Ik geloof dat je dan eens naar unsafe{} moet kijken (in C#, 'k weet niet of C++.NET dat ook heeft.
Maar waarom wil je hem dan eigenlijk hershrijven?

[ Voor 8% gewijzigd door whoami op 20-07-2003 14:07 ]

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 18 July 2003 @ 15:49:
winio werkt alleen onder win9x
Maar DLPortIO werkt ook onder NT, 2000 en XP.
En voor het geval je dat niet aan de gang mocht krijgen:
Zoeken met DLportIO en .NET en klik op 1 van de eerste 2 topics ;)

[ Voor 7% gewijzigd door Creepy op 21-07-2003 09:52 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Winio doet het overigens prima op NT/2k/XP

Verwijderd

Topicstarter
waarom ik het wil herschrijven is omdat ik van alle COM dll's afwil, ik wil geen Interop meer, dus ik dacht, ik kan het gewoon even herschrijven, maar liep op een aantal punten vast, vandaar dat ik even vroeg of ik ook hardware i/o in .NET kon doen, zijn simpele commando'tjes, is eigenlijk steeds een byte schrijven naar de kaart, dat is alles.

Verwijderd

Sorry dat ik 't zo bot moet brengen maar volgens mij ontgaat het complete idee van hardware abstractie binnen het OS en OS abstractie binnen .NET je.

Verwijderd

Topicstarter
volgens mij begrijp ik dat prima, alleen begrijp jij de vraag niet.

ik wil dus geen com dll's meer, maar alleen een assembly die de hardware i/o doen, en of dit kan in c++.net ja of nee.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 23 juli 2003 @ 21:33:
volgens mij begrijp ik dat prima, alleen begrijp jij de vraag niet.

ik wil dus geen com dll's meer, maar alleen een assembly die de hardware i/o doen, en of dit kan in c++.net ja of nee.
DLPortI/O is geen COM???

En als je het prima begrijpt, waarom snap je dan niet dat je een driver nodig hebt om directe I/O te kunnen doen? DLportI/O is zo'n driver en deze is prima te gebruiken in .NET (VB, C++, C#)

[ Voor 7% gewijzigd door Creepy op 23-07-2003 21:55 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
maar dat is dus een COM object, en die wil ik niet meer, ik wil van InterOp af. Dus ik wou gewoon het stukje hardware i/o in een .NET taal doen, ik wist dat je dit niet in vb.net kon doen, dus de vraag was of ik dit in C++.NET kon doen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 24 juli 2003 @ 08:10:
maar dat is dus een COM object, en die wil ik niet meer, ik wil van InterOp af. Dus ik wou gewoon het stukje hardware i/o in een .NET taal doen, ik wist dat je dit niet in vb.net kon doen, dus de vraag was of ik dit in C++.NET kon doen.
Zonder extra drivers of hele vieze hacks met undocumented API calls: nee. (maar dat was je hopelijk nu wel duidelijk.)

En nogmaals: DLPortI/O is geen COM object. DLPortI/O is een VXD die dus automatisch genoeg rechten heeft om Direct I/O te kunnen doen. En deze heeft een interface zodat normale programma's via de driver dus alsnog directe I/O kunen doen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Verwijderd schreef op 23 juli 2003 @ 21:33:
volgens mij begrijp ik dat prima, alleen begrijp jij de vraag niet.

ik wil dus geen com dll's meer, maar alleen een assembly die de hardware i/o doen, en of dit kan in c++.net ja of nee.
Dus jij wil zeggen dat je beseft dat je op een platform werkt dat een hoger abstractie niveua, waar het geheel in 'n compleet managed omgeving werkt die bij voorbeeld ook op freebsd en linux draait en er dan ALSNOG denkt dat je direct hardware mag/kan aanspreken? je kan je eigen geheugen niet eens managen laat staan met je vingertjes aan de hardware komen..kortom of je nou wil of niet je zal of met PINVOKE of via de Com interop een platform (OS) dependend oplossing moeten gebruiken als je dat toch wilt.

  • JohanDM
  • Registratie: Augustus 2002
  • Laatst online: 16-07-2021

JohanDM

Optimist

Ja, het kan in C++.NET.

Maar volgens mij zul je er weinig of geen voordeel kunnen halen uit een zelfgeschreven generieke device driver in met een .NET Assembly layer errond. Omdat het aanspreken van hardware nog steeds in unmanaged code zal moeten gebeuren, moet je dus iedere keer in C++ de contextswitch maken naar managed voor je .NET Assembly interface naar buiten toe. Het performance voordeel dat je hiermee kan halen tegenover een .NET Assembly wrapper rond bv DLPortIO weegt niet op tegen het vele extra werk dat je moet steken in het schrijven, stabiliseren en vooral tunen van je eigen generieke device driver.

Het nadeel van de vele context switches heb je niet als je een echte specifieke device driver scrhijft met een .NET API, dan moet het werk wel in grotere eenheden worden opgedeeld die dan in C++ unmanaged code uitgevoerd worden. Dit geeft minder contextswitches, maar dan moet je wel een eigen API definieren, met een .NET Assembly layer er rond.

"Two things are infinite: the universe and stupidity. And the former I'm not so sure about." -- Albert Einstein

Pagina: 1