Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Use VB.NET dll methods in Qt
QtWS25 Last Chance

Use VB.NET dll methods in Qt

Scheduled Pinned Locked Moved Unsolved General and Desktop
8 Posts 3 Posters 3.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Adil
    wrote on 28 Feb 2017, 00:03 last edited by Adil
    #1

    I've published a post for this problem a week or so ago, but the topic was unsolved. I have tried numerous things and have a more detailed description of the problem now. Please note, I had 0 experience with DLLs, so solutions below are just my assumption from what I've been able to read online.

    Given:

    • DLL from a 3rd party that was built in Visual Studios 2015 using Framework .NET 4.0 and coding language VB.NET.
    • List of inputs and outputs to DLL (it's 1 class, with number of inputs, (1) function and number of outputs. I had the excel with inputs and outputs, but also confirmed inside by using .NET Reflector).

    Problem: Using this DLL (VB.NET) in Qt Creator.

    This article here states that there are (2) options:

    1. .NET DLL exposes a COM interface
    2. .NET DLL does not expose COM interface

    Case 1. NET DLL exposes a COM interface
    I downloaded .NET Reflector and it showed in DLL properties "Assembly: <ComVisibility : False>. My one assumption is that this means that DLL does not expose COM interface. But I still continued. What if it IS COM friendly? Then:

    • I would have to "register" the .DLL using Regasm.exe of Microsoft.NET which will result in TLB file (not sure about this)
    • Use Dumpcpp tool (ActiveQT framework) to import TLB library into my .PRO file which is supposedly will have to create header and source files with all the correct namespaces and classes.
    • Then simply use "import" function for the TLB file and start using DLL methods.

    Case 2. .NET DLL does not expose COM interface
    In this case I have to use "CLR" principles, "C++/CLI" wrapping, etc. I don't know anything about this (!?)

    Questions:

    1. Are my assumptions/steps even remotely right? (feel free to destroy my assumptions, I am not married to them at all)
    2. What is exactly needed in order for Regasm.exe to work properly?
    3. Is it necessary to have Visual Studio to create TLB file?
    4. Can you just simply use dumpcpp and "import" after having TLB file to access the methods?
    5. Have anyone had success implementing .NET DLL into Qt?

    I am a mechanical engineer with some knowledge of coding and voluntarily developing this one tool for my company. I would save a lot of headache by just using C# which I assume will make it fairly easy to work with the given DLL, but I spent so much time researching this so it's a deal of principle now to reach the solution :)

    Any help is greatly appreciated.

    Regards,
    Adil

    H 1 Reply Last reply 28 Feb 2017, 01:14
    0
    • A Adil
      28 Feb 2017, 00:03

      I've published a post for this problem a week or so ago, but the topic was unsolved. I have tried numerous things and have a more detailed description of the problem now. Please note, I had 0 experience with DLLs, so solutions below are just my assumption from what I've been able to read online.

      Given:

      • DLL from a 3rd party that was built in Visual Studios 2015 using Framework .NET 4.0 and coding language VB.NET.
      • List of inputs and outputs to DLL (it's 1 class, with number of inputs, (1) function and number of outputs. I had the excel with inputs and outputs, but also confirmed inside by using .NET Reflector).

      Problem: Using this DLL (VB.NET) in Qt Creator.

      This article here states that there are (2) options:

      1. .NET DLL exposes a COM interface
      2. .NET DLL does not expose COM interface

      Case 1. NET DLL exposes a COM interface
      I downloaded .NET Reflector and it showed in DLL properties "Assembly: <ComVisibility : False>. My one assumption is that this means that DLL does not expose COM interface. But I still continued. What if it IS COM friendly? Then:

      • I would have to "register" the .DLL using Regasm.exe of Microsoft.NET which will result in TLB file (not sure about this)
      • Use Dumpcpp tool (ActiveQT framework) to import TLB library into my .PRO file which is supposedly will have to create header and source files with all the correct namespaces and classes.
      • Then simply use "import" function for the TLB file and start using DLL methods.

      Case 2. .NET DLL does not expose COM interface
      In this case I have to use "CLR" principles, "C++/CLI" wrapping, etc. I don't know anything about this (!?)

      Questions:

      1. Are my assumptions/steps even remotely right? (feel free to destroy my assumptions, I am not married to them at all)
      2. What is exactly needed in order for Regasm.exe to work properly?
      3. Is it necessary to have Visual Studio to create TLB file?
      4. Can you just simply use dumpcpp and "import" after having TLB file to access the methods?
      5. Have anyone had success implementing .NET DLL into Qt?

      I am a mechanical engineer with some knowledge of coding and voluntarily developing this one tool for my company. I would save a lot of headache by just using C# which I assume will make it fairly easy to work with the given DLL, but I spent so much time researching this so it's a deal of principle now to reach the solution :)

      Any help is greatly appreciated.

      Regards,
      Adil

      H Offline
      H Offline
      hskoglund
      wrote on 28 Feb 2017, 01:14 last edited by
      #2

      Hi, I think option 1, using Regasm.exe would be your best choice. Regasm.exe will happily wrap any .NET DLL (as long as it is compiled error free) into either some registry entries for COM consumption and/or write a .tlb file for you that Qt's Dumpcpp tool should be able to read.

      A 2 Replies Last reply 28 Feb 2017, 14:40
      4
      • V Offline
        V Offline
        VRonin
        wrote on 28 Feb 2017, 08:29 last edited by
        #3

        Case 2: Mixing C++/CLI and Qt sometimes introduces unexpected bugs. here you can find a small program that uses .Net API to send emails (I'm not aware of a public C/C++ API for MS Exchange). It builds in Qt creator and it's controlled via sidin/stdout in a QProcess launched by my main application

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        A 1 Reply Last reply 28 Feb 2017, 15:05
        2
        • H hskoglund
          28 Feb 2017, 01:14

          Hi, I think option 1, using Regasm.exe would be your best choice. Regasm.exe will happily wrap any .NET DLL (as long as it is compiled error free) into either some registry entries for COM consumption and/or write a .tlb file for you that Qt's Dumpcpp tool should be able to read.

          A Offline
          A Offline
          Adil
          wrote on 28 Feb 2017, 14:40 last edited by Adil
          #4

          @hskoglund Thank you for the reply.

          1. Will there be any problem if .NET assembly ComVisible property is set to false? (see below, from .NET Reflector)

          0_1488292643800_pic.png

          1. 
            

          TYPELIBS = $$system(dumpcpp -getfile {00062FFF-0000-0000-C000-000000000046})~~

          I assume that the number in {} brackets is an identifier of a TLB library that you get from regasm. Where can I get this number? Is it the same as "Guid" number from the screenshot above? Figured this one out.

          Once again, thank you for your help.

          1 Reply Last reply
          0
          • V VRonin
            28 Feb 2017, 08:29

            Case 2: Mixing C++/CLI and Qt sometimes introduces unexpected bugs. here you can find a small program that uses .Net API to send emails (I'm not aware of a public C/C++ API for MS Exchange). It builds in Qt creator and it's controlled via sidin/stdout in a QProcess launched by my main application

            A Offline
            A Offline
            Adil
            wrote on 28 Feb 2017, 15:05 last edited by
            #5

            @VRonin Thank you for your feedback. The C++/CLI way seems to be more complicated that using dumpcpp tool. However, if dumpcpp doesn't work I will have to use this option.

            1 Reply Last reply
            0
            • H hskoglund
              28 Feb 2017, 01:14

              Hi, I think option 1, using Regasm.exe would be your best choice. Regasm.exe will happily wrap any .NET DLL (as long as it is compiled error free) into either some registry entries for COM consumption and/or write a .tlb file for you that Qt's Dumpcpp tool should be able to read.

              A Offline
              A Offline
              Adil
              wrote on 28 Feb 2017, 21:46 last edited by
              #6

              @hskoglund I was able to use RegAsm command on my DLL. It creates a TLB file but I don't think it imports anything from the DLL, because original DLL is 400kB and TLB file is 2kB. Not sure if this is because <Assembly ComVisibility is "false">.

              I was also able to run dumpcpp tool on the generated TLB file and it created header and source file which I can open in QT but they are empty (for the above reason I suspect).

              1 Reply Last reply
              0
              • H Offline
                H Offline
                hskoglund
                wrote on 1 Mar 2017, 12:29 last edited by
                #7

                Yeah, it seems nowadays the default is to set ComVisibitily to false, because lots of stuff like C# generics do not play well with COM :-(

                So to get some stuff into your TLB file, if you have access the source code of that 3rd party DLL, try prefixing the CLASS statements with <ComVisible(True)> and rebuild the DLL.

                A 1 Reply Last reply 22 Mar 2017, 14:59
                0
                • H hskoglund
                  1 Mar 2017, 12:29

                  Yeah, it seems nowadays the default is to set ComVisibitily to false, because lots of stuff like C# generics do not play well with COM :-(

                  So to get some stuff into your TLB file, if you have access the source code of that 3rd party DLL, try prefixing the CLASS statements with <ComVisible(True)> and rebuild the DLL.

                  A Offline
                  A Offline
                  Adil
                  wrote on 22 Mar 2017, 14:59 last edited by Adil
                  #8

                  @hskoglund @VRonin
                  Hi there! I finally got the DLL back with <ComVisible> property set to "true". So here is what I did:

                  1. Run Regasm.exe on my DLL. My DLL is 386kB and in return I've got 6kB TLB file.
                  2. I used dumpcpp function on my TLB file. I've got header and source file as a result.

                  In my main project I can open these header and source files, the namespaces were created. I can even see classes announced inside of the header and source files. I know for fact that each class has at least 30 variables (float type) and at least 3-4 functions. I cannot find these anywhere in header or source files.

                  So basically I can see announced classes without its methods, although they are definitely Public (checked with .NET Reflector).

                  In my main code after including generated .h file Qt recognizes the namespace and class. So for example I can write:
                  "DLLNamespace::DLLClass MyClass". But when I try to build the project I get "LNK 2001 Unresolved Link" errors.
                  I also tried through pointers "DLLNamespace::DLLClass *Myclass = new DLLNamespace::DLLClass". Same Link errors (something about Metacast and metaobject).

                  I believe that TLB file just creates an access to these classes and namespaces, but I have to somehow load the actual DLL to be able to access methods of these classes. Is this correct or am I missing something here? Do I have to INCLUDEPATH the actual DLL in pro file?

                  Thank you a ton for all the help, I've gotten this far now thanks to you guys :) Hopefully I will eventually succeed!

                  1 Reply Last reply
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved