Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
CODE PROJECT For Those Who Code
  • Home
  • Articles
  • FAQ
Community
  1. Home
  2. General Programming
  3. C#
  4. HowTo make a dll, which can be called by VBA

HowTo make a dll, which can be called by VBA

Scheduled Pinned Locked Moved C#
csharpquestion
17 Posts 5 Posters 0 Views 1 Watching
  • 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 Ariadne

    Really? Is it complicate to register a dll as com?

    Ariadne

    N Offline
    N Offline
    Nader Elshehabi
    wrote on last edited by
    #5

    Well, not really. You can follow the link to the post I gave you in the previous reply. Here is the link again[^].

    Regards:rose:

    1 Reply Last reply
    0
    • N Nader Elshehabi

      What Mav said is true. But as an addition, you can write your code as C# and make your C# dll, then register it as COM dll then use it from your VBA macro. I think this post[^] would be helpful.

      Regards:rose:

      A Offline
      A Offline
      Ariadne
      wrote on last edited by
      #6

      Thanks. If I use tlbexp I get only my class exposed, but not my methods. Any ideas? (I suppose, the methods have to have a certain format.) Nevertheless I do not belive, that a COM-object is the only way to get a connection to VBA. With a COM-object you do not need a Declare Function statement. But with a Declare Function one can access all routines eg. in the kernel.dll. (And that are not COM's in kernel.dll).

      Ariadne

      N A 2 Replies Last reply
      0
      • A Ariadne

        Thanks. If I use tlbexp I get only my class exposed, but not my methods. Any ideas? (I suppose, the methods have to have a certain format.) Nevertheless I do not belive, that a COM-object is the only way to get a connection to VBA. With a COM-object you do not need a Declare Function statement. But with a Declare Function one can access all routines eg. in the kernel.dll. (And that are not COM's in kernel.dll).

        Ariadne

        N Offline
        N Offline
        Nader Elshehabi
        wrote on last edited by
        #7

        If you got your class exposed, how come not the methods in it?? Aren't they public? If there is some sort of a VBA .Net language then this would be a solution to your problem, bur otherwise there is no other direct conection between umanaged-to-managed code that I know of.

        Regards:rose:

        1 Reply Last reply
        0
        • A Ariadne

          Thanks. If I use tlbexp I get only my class exposed, but not my methods. Any ideas? (I suppose, the methods have to have a certain format.) Nevertheless I do not belive, that a COM-object is the only way to get a connection to VBA. With a COM-object you do not need a Declare Function statement. But with a Declare Function one can access all routines eg. in the kernel.dll. (And that are not COM's in kernel.dll).

          Ariadne

          A Offline
          A Offline
          Ariadne
          wrote on last edited by
          #8

          public class PW { public static string Convert5Bit(byte[] abytID) { //do somthing here ... return sConv; } } This is the declaration. But only PW as class is exposed. -- modified at 5:19 Thursday 26th October, 2006

          Ariadne

          N S 2 Replies Last reply
          0
          • A Ariadne

            public class PW { public static string Convert5Bit(byte[] abytID) { //do somthing here ... return sConv; } } This is the declaration. But only PW as class is exposed. -- modified at 5:19 Thursday 26th October, 2006

            Ariadne

            N Offline
            N Offline
            Nader Elshehabi
            wrote on last edited by
            #9

            First: Post your question to my answers, not to your question. I only saw your question by chance. Second: Try to reference to your new COM object in a C++ or C# project and see what is/isn't exposed Third: If none other works -I'm not that expert in VBA so if applicable- Make your method non-static, and call it form an instance of the class rather than the calss itself. Ps. BTW, what way did you know by it's not exposed?

            Regards:rose:

            A 1 Reply Last reply
            0
            • A Ariadne

              public class PW { public static string Convert5Bit(byte[] abytID) { //do somthing here ... return sConv; } } This is the declaration. But only PW as class is exposed. -- modified at 5:19 Thursday 26th October, 2006

              Ariadne

              S Offline
              S Offline
              SSLaks
              wrote on last edited by
              #10

              VBA does not support static functions. Also, you are confusing Declare with COM. To get at an exposed COM object in VBA, ad a reference to it, then instansiate the class. Declare Function has nothing to do with COM - it uses access points, which cannot be created from C#. To create an access point, use an MFC dll. Schabse S. Laks

              1 Reply Last reply
              0
              • N Nader Elshehabi

                First: Post your question to my answers, not to your question. I only saw your question by chance. Second: Try to reference to your new COM object in a C++ or C# project and see what is/isn't exposed Third: If none other works -I'm not that expert in VBA so if applicable- Make your method non-static, and call it form an instance of the class rather than the calss itself. Ps. BTW, what way did you know by it's not exposed?

                Regards:rose:

                A Offline
                A Offline
                Ariadne
                wrote on last edited by
                #11

                thanks for 1st. 2nd I look into the code with notepad and try in VBA the Object-Browser. both show only PW and not Convert5Bit() 3rd it tried that, but no success. thanks for your ansers! :rose:

                Ariadne

                N 1 Reply Last reply
                0
                • A Ariadne

                  Really? Is it complicate to register a dll as com?

                  Ariadne

                  E Offline
                  E Offline
                  ednrgc
                  wrote on last edited by
                  #12

                  you should check : ServicedComponent

                  1 Reply Last reply
                  0
                  • A Ariadne

                    thanks for 1st. 2nd I look into the code with notepad and try in VBA the Object-Browser. both show only PW and not Convert5Bit() 3rd it tried that, but no success. thanks for your ansers! :rose:

                    Ariadne

                    N Offline
                    N Offline
                    Nader Elshehabi
                    wrote on last edited by
                    #13

                    Ariadne wrote:

                    Object-Browser. both show only PW and not Convert5Bit()

                    Well, in that object browser the method should be under the class name, shouldn't it? I mean you access the method by the class name? Also what file did you look into using the notepad?

                    Ariadne wrote:

                    3rd it tried that, but no success.

                    Define "no success"? You can't instantiate the object from the exposed class? Or the instance can't access the member function?

                    Regards:rose:

                    A 1 Reply Last reply
                    0
                    • N Nader Elshehabi

                      Ariadne wrote:

                      Object-Browser. both show only PW and not Convert5Bit()

                      Well, in that object browser the method should be under the class name, shouldn't it? I mean you access the method by the class name? Also what file did you look into using the notepad?

                      Ariadne wrote:

                      3rd it tried that, but no success.

                      Define "no success"? You can't instantiate the object from the exposed class? Or the instance can't access the member function?

                      Regards:rose:

                      A Offline
                      A Offline
                      Ariadne
                      wrote on last edited by
                      #14

                      Nader Elshehabi wrote:

                      Also what file did you look into using the notepad?

                      I opened the tlb-File with notepad: There was no Convert5Bit.

                      Nader Elshehabi wrote:

                      object browser the method should be under the class name

                      Under the class name is no method. If I instantiate the class I get an runtime error: 429 ActiveX component can't create object. But VBA knows the class PW.

                      Ariadne

                      N A 2 Replies Last reply
                      0
                      • A Ariadne

                        Nader Elshehabi wrote:

                        Also what file did you look into using the notepad?

                        I opened the tlb-File with notepad: There was no Convert5Bit.

                        Nader Elshehabi wrote:

                        object browser the method should be under the class name

                        Under the class name is no method. If I instantiate the class I get an runtime error: 429 ActiveX component can't create object. But VBA knows the class PW.

                        Ariadne

                        N Offline
                        N Offline
                        Nader Elshehabi
                        wrote on last edited by
                        #15

                        Well, I haven't tested the issue thoroughly. I did some googling and found this post on MSDN forum Post link[^] and here are two more articles in MSDN about the issue: Article 1[^] Article 2[^] Also I did what I told you. I made a tlb from the .Net dll, and it actually references to the class and the methods inside the class!! About the instantiation errer; Did you make your constructor public? I hope this directs you somewhere. Good luck! And I'm waiting for your feedback.

                        Regards:rose:

                        A 1 Reply Last reply
                        0
                        • N Nader Elshehabi

                          Well, I haven't tested the issue thoroughly. I did some googling and found this post on MSDN forum Post link[^] and here are two more articles in MSDN about the issue: Article 1[^] Article 2[^] Also I did what I told you. I made a tlb from the .Net dll, and it actually references to the class and the methods inside the class!! About the instantiation errer; Did you make your constructor public? I hope this directs you somewhere. Good luck! And I'm waiting for your feedback.

                          Regards:rose:

                          A Offline
                          A Offline
                          Ariadne
                          wrote on last edited by
                          #16

                          Thanks for your articles. I read a lot of stuff too.:omg: But it seams there is something basic wrong. here the story, what I try: 1. I build a classlibrary-project in VS8 C#. 2. I insert one TestDLL class: using System; using System.Collections.Generic; using System.Text; public class TestDLL { public string StringChange(string str) { return str +" from C#"; } } 3. I build the project with a TestDLL.dll as result 4. I run tlbexp TestDLL.dll /win 32 /out:TestDLL.tlb 5. An inspection of TestDLL.tlb with notepad.exe shows no StringChange string. 6. I run regasm TestDLL.dll It returns a waring: RA00000 : there are no types registered (retranslation from german) 7. I tested the same on a virgin VS8 Enviroment on my home notebook with the same result. 8. I have no idea....:(

                          Ariadne

                          1 Reply Last reply
                          0
                          • A Ariadne

                            Nader Elshehabi wrote:

                            Also what file did you look into using the notepad?

                            I opened the tlb-File with notepad: There was no Convert5Bit.

                            Nader Elshehabi wrote:

                            object browser the method should be under the class name

                            Under the class name is no method. If I instantiate the class I get an runtime error: 429 ActiveX component can't create object. But VBA knows the class PW.

                            Ariadne

                            A Offline
                            A Offline
                            Ariadne
                            wrote on last edited by
                            #17

                            That's it: in assemblyinfo.cs there is a switch: [assembly: ComVisible(true)] but it was false Now all works fine...:laugh: Thank you for your support Nader

                            Ariadne

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • World
                            • Users
                            • Groups