Prev: C# working with reporting services
Next: LINQ: Select records but enforce one field to be unique
From: PvdG42 on 6 Mar 2010 18:26 Trying to use a MagTek mag card swipe reader in a C# Win app. The only API MagTek offers for Windows is via VB6 OCX (COM DLL). I can use the DL and its methods in a VB .NET app with no problems, both in VS 2008 and in direct execution of the VB app in Windows outside the IDE. I developed a simple C# app (identical to an early VB test app), to use the MagTek DLL, but the C# version fails to initialize the swipe reader with the failing code found as generated in <appname>.designer.cs. The failing statement in C#: ((System.ComponentModel.ISupportInitialize)(this.axUSBHID1)).EndInit(); The successful VB equivalent statement: CType(Me.USBHID1, System.ComponentModel.ISupportInitialize).EndInit() You may well ask, why not just proceed in VB? I have an associate who is quite experienced in C#, but not in VB, and thus prefers to use C#. I realize that I may well have failed to supply all needed info, and will on request. Any advice/suggestions? TIA.
From: Peter Duniho on 6 Mar 2010 19:16 PvdG42 wrote: > Trying to use a MagTek mag card swipe reader in a C# Win app. The only > API MagTek offers for Windows is via VB6 OCX (COM DLL). I can use the DL > and its methods in a VB .NET app with no problems, both in VS 2008 and > in direct execution of the VB app in Windows outside the IDE. > > I developed a simple C# app (identical to an early VB test app), to use > the MagTek DLL, but the C# version fails to initialize the swipe reader > with the failing code found as generated in <appname>.designer.cs. > > The failing statement in C#: > > ((System.ComponentModel.ISupportInitialize)(this.axUSBHID1)).EndInit(); > > The successful VB equivalent statement: > > CType(Me.USBHID1, System.ComponentModel.ISupportInitialize).EndInit() > > You may well ask, why not just proceed in VB? I have an associate who is > quite experienced in C#, but not in VB, and thus prefers to use C#. > > I realize that I may well have failed to supply all needed info, and > will on request. > > Any advice/suggestions? Without a specific description of the failure, never mind a concise-but-complete code example, it would be practically impossible to know for sure what the issue is. However, as a shot in the dark, have you tried making sure that you access the COM object in an STA thread? Have you taken steps to make sure you only access the COM object in the STA thread in which it was created? You may (or may not) find a recent discussion on the question of COM interop in C# that we had here: http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/29149effba98d9d5/d596d851ee927ad1 You might also consider using Reflector to convert the VB.NET code that is known to work to C# code. You may find that VB.NET is doing things on your behalf that C# requires you do to explicitly. Underneath, it's all IL code so if it works in VB.NET, you should be able to get it to work in C# too. :) (Actually, that's not quite true�VB.NET has some features that are simply not supported in C#; but I think that COM interop wouldn't need any of those features). Pete
From: PvdG42 on 6 Mar 2010 20:06 "PvdG42" <pvdg42(a)toadstool.edu> wrote in message news:#YTEmRYvKHA.812(a)TK2MSFTNGP06.phx.gbl... > Trying to use a MagTek mag card swipe reader in a C# Win app. The only API > MagTek offers for Windows is via VB6 OCX (COM DLL). I can use the DL and > its methods in a VB .NET app with no problems, both in VS 2008 and in > direct execution of the VB app in Windows outside the IDE. > > I developed a simple C# app (identical to an early VB test app), to use > the MagTek DLL, but the C# version fails to initialize the swipe reader > with the failing code found as generated in <appname>.designer.cs. > > The failing statement in C#: > > ((System.ComponentModel.ISupportInitialize)(this.axUSBHID1)).EndInit(); > > The successful VB equivalent statement: > > CType(Me.USBHID1, System.ComponentModel.ISupportInitialize).EndInit() > > You may well ask, why not just proceed in VB? I have an associate who is > quite experienced in C#, but not in VB, and thus prefers to use C#. > > I realize that I may well have failed to supply all needed info, and will > on request. > > Any advice/suggestions? > > TIA. This is to myself as well as to Peter, who was kind enough to respond. I should have included the exception and error message raised by the failing C# statement: "Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))" The example that exhibits this behavior is simple and (relatively) concise example, but whomever wanted to investigate would have to install the Magtek OCX as well as having the example app. I'll be happy to zip the two up and upload/send the archive to anyone who wants to see it. Meanwhile, I'll take Peter's suggestion to use Reflector to translate the VB code and see what I may have missed when I did the manual conversion.
From: Peter Duniho on 6 Mar 2010 21:04 PvdG42 wrote: > I should have included the exception and error message raised by the > failing C# statement: > > "Class not registered (Exception from HRESULT: 0x80040154 > (REGDB_E_CLASSNOTREG))" Based on that error, I think there's almost no chance my previous guess will be helpful. The error sounds like there's some problem mapping to a COM classbeing used. But you still could provide more detail than you have, even without a full example with the DLL. For example, you're calling an EndInit() method; was there a prior call to BeginInit()? Are you using the same object reference for both? What other initialization may or may not have occurred? Showing at least both the VB.NET and C# code involved in initializing this COM object would be useful. If you're successfully calling BeginInit() on the same object, that suggests that the COM object you're using directly is fine, and that it itself is having some problem not finding a required COM class. Also, the ISupportInitialize interface _should_ be an optimization, rather than required. So another test might be to simply remove the calls to BeginInit() and EndInit() and see if that works. Of course, if there's not actually a call to BeginInit() before the call to EndInit(), that might be part of the problem. :) Perhaps looking at the VB.NET-compiled code will lead to a solution. If not, maybe the above provides other things to think about. Pete
From: PvdG42 on 7 Mar 2010 12:28 "Peter Duniho" <no.peted.spam(a)no.nwlink.spam.com> wrote in message news:uHdV#pZvKHA.796(a)TK2MSFTNGP05.phx.gbl... > PvdG42 wrote: >> I should have included the exception and error message raised by the >> failing C# statement: >> >> "Class not registered (Exception from HRESULT: 0x80040154 >> (REGDB_E_CLASSNOTREG))" > > Based on that error, I think there's almost no chance my previous guess > will be helpful. > > The error sounds like there's some problem mapping to a COM classbeing > used. But you still could provide more detail than you have, even without > a full example with the DLL. For example, you're calling an EndInit() > method; was there a prior call to BeginInit()? Are you using the same > object reference for both? What other initialization may or may not have > occurred? Showing at least both the VB.NET and C# code involved in > initializing this COM object would be useful. > > If you're successfully calling BeginInit() on the same object, that > suggests that the COM object you're using directly is fine, and that it > itself is having some problem not finding a required COM class. > > Also, the ISupportInitialize interface _should_ be an optimization, rather > than required. So another test might be to simply remove the calls to > BeginInit() and EndInit() and see if that works. > > Of course, if there's not actually a call to BeginInit() before the call > to EndInit(), that might be part of the problem. :) > > Perhaps looking at the VB.NET-compiled code will lead to a solution. If > not, maybe the above provides other things to think about. > > Pete Actually, (and, boy is my face red!!) I stumbled on the cure early this morning while comparing project properties with the VB version. Turns out I had failed to specify an x86 target platform in the C# project. The vb OCX requires this to work. I'm developing on a x64 Win 7 box, where the target defaults to "any...". Like the scarecrow in Alice, I need a brain. Sorry to take up your time, and thanks!
|
Next
|
Last
Pages: 1 2 Prev: C# working with reporting services Next: LINQ: Select records but enforce one field to be unique |