Utsette C # struct til COM bryter for VB6 app

stemmer
4

Sist oppdatert: 2009-08-11 14:30 EDT

For noen dager siden jeg postet dette spørsmålet om noen svært merkelige problemer. Vel, jeg har funnet ut hva som konkret var årsaken en bygge på en maskin for å ikke kjøre på andre og selv kom opp med en work-around, men nå er det etterlater meg med en fin, spesifikt spørsmål: Hvorfor?

For å gjenskape problemet, jeg skaper en ny InteropUserControl og gjør følgende:

  1. Legg til en ny public struct MyStruct:
  2. Gi det en GUID og ComVisibleattributter
  3. Legg et GetMyStructmedlem til _InteropUserControlgrensesnittet og implementere den i InteropUserControl.

MyStruct:

[Guid(49E803EC-BED9-4a08-B42B-E0499864A169)]
[ComVisible(true)]
public struct MyStruct {
    public int mynumber;
}

_InteropUserControl.GetMyStruct():

[DispId(7)]
void getMyStruct( int num, ref MyStruct data );

(Jeg har prøvd å returnere MyStructsteden for å føres ved referanse, så vel.)

InteropUserControl.GetMyStruct() gjennomføring:

public void getMyStruct( int num, ref MyStruct data ) {
    data = new MyStruct();
    data.mynumber = num * 2;
}

Jeg registrerer også montering og installer den til GAC og registrere med Regasm. Ved å legge det til en ny VB6 prosjekt og legge et kall til GetMyStruct()og samle på vår build maskin, nekter den å kjøre på andre maskiner.

For å komme rundt dette, måtte jeg utsette en klasse til Com i stedet for struct, og i utgangspunktet endre GetMyStructtil dette:

public void GetMyData( int num, MyClass data ) {
    data.mynumber = num * 2;
}

I min faktiske prosjekt, jeg hente struct internt, og deretter kopiere alle feltverdier fra struct til matchende medlemmer på forekomst av klassen gikk til metoden av klienten.

Så hvorfor gjorde en struct årsak denne atferden og en klasse fungerte fint? Er det noen magiske å utsette en struct til COM for bruk i VB6?

Jeg tror det kan ha noe å gjøre med OLE Automation.

Merk: Jeg har også prøvd å returnere struct stedet for å bruke en refparameter, men som ikke endrer atferd.

Edit for å legge lenker til prosjekt mal:

Interop Forms Toolkit 2.0 er den opprinnelige VB.NET prosjektet mal og dll. Jeg vet ikke referere til dll, slik at du ikke trenger å installere dette.

C # Oversettelser av maler på CodeProject er hva jeg brukte for å lage mine (prosjektmalen, ikke elementmalen). Den VB.NET versjonen genererer __InteropUserControlhendelsen grensesnittet, _InteropUserControlgrensesnitt, og noen få relevante attributter automagisk. De er eksplisitt kodet i C # versjon, og det er omtrent alt som er forskjellig mellom de to.

Publisert på 25/07/2009 klokken 21:55
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Jeg tror jeg har funnet en løsning på dette problemet. Jeg hadde nøyaktig samme problem, VB6 pauser når du ringer en metode for en Interop-biblioteket ved å bestå en struktur. Dette er et prosjekt jeg laget for å teste en DLL Interop, så alt jeg har i mitt prosjekt var en form. Men jeg hadde et annet prosjekt (hovedsøknad) med samme referanse og det fungerer fint.

Etter å ha lest Joel innlegg, ønsket jeg å teste sin løsning og faktisk id fungerte (ved hjelp av en klasse i stedet en struktur). Men jeg har andre interops hvor jeg bruker strukturer, så jeg var ganske bekymret for at på ethvert tidspunkt min søknad kan mislykkes. I tillegg jeg ikke ønsker å gjøre det ekstra arbeidet med å skape og utsette grensesnitt og en klasse for å erstatte strukturen.

Så tok jeg koden fra formen min og flytte den til et offentlig sub i en modul. Det fungerte umiddelbart. Forresten, det er hvordan jeg hadde gjennomført samtalen i den viktigste applikasjonen som jobbet ok.

Jeg håper det kan hjelpe andre.

Svarte 10/10/2009 kl. 18:41
kilden bruker

stemmer
1

Er det noen magiske å utsette en struct til COM for bruk i VB6?

Artikkelen COM datatyper * på MSDN sier at structs er støttet. Spesifikt sier MSDN-artikkelen som COM strukturer er definert som:

ByRef VALUETYPE< MyStruct >

Det finnes også et par artikler om customing COM-oppsigelige wrappers nederst på siden, kan du ønsker å se dem.

  • Edit (2016): Original linken ble ødelagt, så jeg fikset det til versjon 3.5 av .NET Framework.
Svarte 09/08/2009 kl. 14:49
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more