using a class defined in a c++ dll in c# code












60















I have a dll that was written in c++, I need to use this dll in my c# code. After searching I found that using P/Invoke would give me access to the function I need, but these functions are defined with in a class and use non-static private member variables. So I need to be able to create an instance of this class to properly use the functions. How can I gain access to this class so that I can create an instance? I have been unable to find a way to do this.



I guess I should note that the c++ dll is not my code.










share|improve this question



























    60















    I have a dll that was written in c++, I need to use this dll in my c# code. After searching I found that using P/Invoke would give me access to the function I need, but these functions are defined with in a class and use non-static private member variables. So I need to be able to create an instance of this class to properly use the functions. How can I gain access to this class so that I can create an instance? I have been unable to find a way to do this.



    I guess I should note that the c++ dll is not my code.










    share|improve this question

























      60












      60








      60


      38






      I have a dll that was written in c++, I need to use this dll in my c# code. After searching I found that using P/Invoke would give me access to the function I need, but these functions are defined with in a class and use non-static private member variables. So I need to be able to create an instance of this class to properly use the functions. How can I gain access to this class so that I can create an instance? I have been unable to find a way to do this.



      I guess I should note that the c++ dll is not my code.










      share|improve this question














      I have a dll that was written in c++, I need to use this dll in my c# code. After searching I found that using P/Invoke would give me access to the function I need, but these functions are defined with in a class and use non-static private member variables. So I need to be able to create an instance of this class to properly use the functions. How can I gain access to this class so that I can create an instance? I have been unable to find a way to do this.



      I guess I should note that the c++ dll is not my code.







      c# c++ dll pinvoke






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 24 '08 at 18:49









      Dan VogelDan Vogel

      1,76573353




      1,76573353
























          7 Answers
          7






          active

          oldest

          votes


















          77














          There is no way to directly use a C++ class in C# code. You can use PInvoke in an indirect fashion to access your type.



          The basic pattern is that for every member function in class Foo, create an associated non-member function which calls into the member function.



          class Foo {
          public:
          int Bar();
          };
          extern "C" Foo* Foo_Create() { return new Foo(); }
          extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
          extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }


          Now it's a matter of PInvoking these methods into your C# code



          [DllImport("Foo.dll")]
          public static extern IntPtr Foo_Create();

          [DllImport("Foo.dll")]
          public static extern int Foo_Bar(IntPtr value);

          [DllImport("Foo.dll")]
          public static extern void Foo_Delete(IntPtr value);


          The downside is you'll have an awkward IntPtr to pass around but it's a somewhat simple matter to create a C# wrapper class around this pointer to create a more usable model.



          Even if you don't own this code, you can create another DLL which wraps the original DLL and provides a small PInvoke layer.






          share|improve this answer





















          • 1





            The statement of "There is no way to directly use a C++ class in C# code" is not correct. A static C++ function works the same way as C-style function and the instance functions can be declared as ThisCall calling convention by adding ThisObject pointing to the instance itself as the first argument. For details, you may want to read my Blogs. You may also want to try our tool.(I am the author)

            – xInterop
            Apr 11 '14 at 1:09








          • 2





            Though a fine answer at the time, it's arguably better to use c++/CLI so as to avoid the manual creation of proxy functions - something that could become quite tedious rather quickly

            – MickyD
            Feb 15 '15 at 17:40






          • 1





            Should the C++ proxy functions be surrounded by extern "C" { .... } or is it fine to do it purely in C++?

            – divB
            Apr 1 '15 at 6:26



















          16














          Marshal C++ Class and use the PInvoke



          C++ Code ,ClassName.h



          class __declspec(dllexport) CClassName
          {
          public:
          CClassName();
          ~CClassName();
          void function();

          };


          C++ Code, ClassName.cpp



          CClassName::CClassName()
          {
          }

          CClassName::~CClassName()
          {
          }

          void CClassName::function()
          {
          std::cout << "Bla bla bla" << std::endl;

          }


          C++ Code, ClassNameCaller.h file for the caller function



          #include "ClassName.h"      

          #ifdef __cplusplus
          extern "C" {
          #endif

          extern __declspec(dllexport) CClassName* CreateClassName();

          extern __declspec(dllexport) void DisposeClassName(CClassName* a_pObject);

          extern __declspec(dllexport) void function(CClassName* a_pObject);


          #ifdef __cplusplus
          }
          #endif


          C++ Code, ClassNameCaller.cpp file for the caller function



          #include "ClassNameCaller.h"


          CClassName* CreateClassName()
          {
          return new CClassName();
          }

          void DisposeClassName(CClassName* a_pObject)
          {
          if(a_pObject!= NULL)
          {
          delete a_pObject;
          a_pObject= NULL;
          }
          }

          void function(CClassName* a_pObject)
          {
          if(a_pObject!= NULL)
          {
          a_pObject->function();
          }
          }


          C# code



          [DllImport("ClassNameDll.dll")]
          static public extern IntPtr CreateClassName();

          [DllImport("ClassNameDll.dll")]
          static public extern void DisposeClassName(IntPtr pClassNameObject);

          [DllImport("ClassNameDll.dll")]
          static public extern void CallFunction(IntPtr pClassNameObject);

          //use the functions
          IntPtr pClassName = CreateClassName();

          CallFunction(pClassName);

          DisposeClassName(pClassName);

          pClassName = IntPtr.Zero;





          share|improve this answer





















          • 2





            Well written. :)

            – Ehsan Ab
            Sep 8 '16 at 10:26






          • 1





            Shouldn't there be a "dllexport" instead "dllimport" in the first file, ClassName.h?

            – P.W.
            Mar 7 '18 at 17:11











          • Yes , It is used to export this class to .Net project so we can use the CClassName class

            – Amir Twito
            Mar 8 '18 at 5:20






          • 1





            This example really helped a lot, Thank you so much:-)

            – Ashish Rana
            Mar 28 '18 at 10:15











          • Hi. Not sure if this is too late, but can you show a modification of your code where I can pass strings through the function, modify them and then return them to the c# code? I've been trying but it won't allow me to add type names in a_pObject->function(std::string args1);

            – CausticLasagne
            Nov 4 '18 at 20:29



















          4














          Here is a sample how to call C++ class method from VB - for C# you only have to rewrite the sample program in Step 4.






          share|improve this answer































            3














            myfile.i



            %module learnaboutswig

            class A

            {

            public:

            void boringfunction(char *charstr);
            };


            download swig from swig.org



            swig -c++ -csharp myfile.i



            look at the output, see if it will work for you.






            share|improve this answer

































              2














              You may need to write an intermediary DLL (in C++, perhaps) that handles this for you and exposes the interface you need. Your DLL would be in charge of loading the 3rd party DLL, creating an instance of this C++ object, and exposing its member functions as needed via whatever API you design. You would then use P/Invoke to get at your API and cleanly manipulate the object.



              Note: For the API of your DLL, try keeping the data types limited to primitives (long, int, char*, etc.) to prevent module boundary issues.






              share|improve this answer































                2














                I agree with JaredPar.
                Creating instances of unmanaged classes in managed code should not be possible.



                Another thing is - if you could recompile the DLL in managed C++ or make a COM component out of it, it would be much easier/






                share|improve this answer































                  2














                  The way I've done this is by creating a thin Managed C++ wrapper around my unmanaged C++ DLL. The managed wrapper contains "proxy" classes that wrap around the unmanaged code exposing the interface that's needed by the .NET application.
                  This is a bit of double work but it allows quite seamless operation in normal environments. Things do get trickier with dependencies in some circumstances (such as ASP.NET) but you will probably not run into that.






                  share|improve this answer























                    Your Answer






                    StackExchange.ifUsing("editor", function () {
                    StackExchange.using("externalEditor", function () {
                    StackExchange.using("snippets", function () {
                    StackExchange.snippets.init();
                    });
                    });
                    }, "code-snippets");

                    StackExchange.ready(function() {
                    var channelOptions = {
                    tags: "".split(" "),
                    id: "1"
                    };
                    initTagRenderer("".split(" "), "".split(" "), channelOptions);

                    StackExchange.using("externalEditor", function() {
                    // Have to fire editor after snippets, if snippets enabled
                    if (StackExchange.settings.snippets.snippetsEnabled) {
                    StackExchange.using("snippets", function() {
                    createEditor();
                    });
                    }
                    else {
                    createEditor();
                    }
                    });

                    function createEditor() {
                    StackExchange.prepareEditor({
                    heartbeatType: 'answer',
                    autoActivateHeartbeat: false,
                    convertImagesToLinks: true,
                    noModals: true,
                    showLowRepImageUploadWarning: true,
                    reputationToPostImages: 10,
                    bindNavPrevention: true,
                    postfix: "",
                    imageUploader: {
                    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                    allowUrls: true
                    },
                    onDemand: true,
                    discardSelector: ".discard-answer"
                    ,immediatelyShowMarkdownHelp:true
                    });


                    }
                    });














                    draft saved

                    draft discarded


















                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f315051%2fusing-a-class-defined-in-a-c-dll-in-c-sharp-code%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown

























                    7 Answers
                    7






                    active

                    oldest

                    votes








                    7 Answers
                    7






                    active

                    oldest

                    votes









                    active

                    oldest

                    votes






                    active

                    oldest

                    votes









                    77














                    There is no way to directly use a C++ class in C# code. You can use PInvoke in an indirect fashion to access your type.



                    The basic pattern is that for every member function in class Foo, create an associated non-member function which calls into the member function.



                    class Foo {
                    public:
                    int Bar();
                    };
                    extern "C" Foo* Foo_Create() { return new Foo(); }
                    extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
                    extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }


                    Now it's a matter of PInvoking these methods into your C# code



                    [DllImport("Foo.dll")]
                    public static extern IntPtr Foo_Create();

                    [DllImport("Foo.dll")]
                    public static extern int Foo_Bar(IntPtr value);

                    [DllImport("Foo.dll")]
                    public static extern void Foo_Delete(IntPtr value);


                    The downside is you'll have an awkward IntPtr to pass around but it's a somewhat simple matter to create a C# wrapper class around this pointer to create a more usable model.



                    Even if you don't own this code, you can create another DLL which wraps the original DLL and provides a small PInvoke layer.






                    share|improve this answer





















                    • 1





                      The statement of "There is no way to directly use a C++ class in C# code" is not correct. A static C++ function works the same way as C-style function and the instance functions can be declared as ThisCall calling convention by adding ThisObject pointing to the instance itself as the first argument. For details, you may want to read my Blogs. You may also want to try our tool.(I am the author)

                      – xInterop
                      Apr 11 '14 at 1:09








                    • 2





                      Though a fine answer at the time, it's arguably better to use c++/CLI so as to avoid the manual creation of proxy functions - something that could become quite tedious rather quickly

                      – MickyD
                      Feb 15 '15 at 17:40






                    • 1





                      Should the C++ proxy functions be surrounded by extern "C" { .... } or is it fine to do it purely in C++?

                      – divB
                      Apr 1 '15 at 6:26
















                    77














                    There is no way to directly use a C++ class in C# code. You can use PInvoke in an indirect fashion to access your type.



                    The basic pattern is that for every member function in class Foo, create an associated non-member function which calls into the member function.



                    class Foo {
                    public:
                    int Bar();
                    };
                    extern "C" Foo* Foo_Create() { return new Foo(); }
                    extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
                    extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }


                    Now it's a matter of PInvoking these methods into your C# code



                    [DllImport("Foo.dll")]
                    public static extern IntPtr Foo_Create();

                    [DllImport("Foo.dll")]
                    public static extern int Foo_Bar(IntPtr value);

                    [DllImport("Foo.dll")]
                    public static extern void Foo_Delete(IntPtr value);


                    The downside is you'll have an awkward IntPtr to pass around but it's a somewhat simple matter to create a C# wrapper class around this pointer to create a more usable model.



                    Even if you don't own this code, you can create another DLL which wraps the original DLL and provides a small PInvoke layer.






                    share|improve this answer





















                    • 1





                      The statement of "There is no way to directly use a C++ class in C# code" is not correct. A static C++ function works the same way as C-style function and the instance functions can be declared as ThisCall calling convention by adding ThisObject pointing to the instance itself as the first argument. For details, you may want to read my Blogs. You may also want to try our tool.(I am the author)

                      – xInterop
                      Apr 11 '14 at 1:09








                    • 2





                      Though a fine answer at the time, it's arguably better to use c++/CLI so as to avoid the manual creation of proxy functions - something that could become quite tedious rather quickly

                      – MickyD
                      Feb 15 '15 at 17:40






                    • 1





                      Should the C++ proxy functions be surrounded by extern "C" { .... } or is it fine to do it purely in C++?

                      – divB
                      Apr 1 '15 at 6:26














                    77












                    77








                    77







                    There is no way to directly use a C++ class in C# code. You can use PInvoke in an indirect fashion to access your type.



                    The basic pattern is that for every member function in class Foo, create an associated non-member function which calls into the member function.



                    class Foo {
                    public:
                    int Bar();
                    };
                    extern "C" Foo* Foo_Create() { return new Foo(); }
                    extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
                    extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }


                    Now it's a matter of PInvoking these methods into your C# code



                    [DllImport("Foo.dll")]
                    public static extern IntPtr Foo_Create();

                    [DllImport("Foo.dll")]
                    public static extern int Foo_Bar(IntPtr value);

                    [DllImport("Foo.dll")]
                    public static extern void Foo_Delete(IntPtr value);


                    The downside is you'll have an awkward IntPtr to pass around but it's a somewhat simple matter to create a C# wrapper class around this pointer to create a more usable model.



                    Even if you don't own this code, you can create another DLL which wraps the original DLL and provides a small PInvoke layer.






                    share|improve this answer















                    There is no way to directly use a C++ class in C# code. You can use PInvoke in an indirect fashion to access your type.



                    The basic pattern is that for every member function in class Foo, create an associated non-member function which calls into the member function.



                    class Foo {
                    public:
                    int Bar();
                    };
                    extern "C" Foo* Foo_Create() { return new Foo(); }
                    extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
                    extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }


                    Now it's a matter of PInvoking these methods into your C# code



                    [DllImport("Foo.dll")]
                    public static extern IntPtr Foo_Create();

                    [DllImport("Foo.dll")]
                    public static extern int Foo_Bar(IntPtr value);

                    [DllImport("Foo.dll")]
                    public static extern void Foo_Delete(IntPtr value);


                    The downside is you'll have an awkward IntPtr to pass around but it's a somewhat simple matter to create a C# wrapper class around this pointer to create a more usable model.



                    Even if you don't own this code, you can create another DLL which wraps the original DLL and provides a small PInvoke layer.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Jun 29 '18 at 16:02









                    milleniumbug

                    12.6k33362




                    12.6k33362










                    answered Nov 24 '08 at 18:54









                    JaredParJaredPar

                    577k12010671349




                    577k12010671349








                    • 1





                      The statement of "There is no way to directly use a C++ class in C# code" is not correct. A static C++ function works the same way as C-style function and the instance functions can be declared as ThisCall calling convention by adding ThisObject pointing to the instance itself as the first argument. For details, you may want to read my Blogs. You may also want to try our tool.(I am the author)

                      – xInterop
                      Apr 11 '14 at 1:09








                    • 2





                      Though a fine answer at the time, it's arguably better to use c++/CLI so as to avoid the manual creation of proxy functions - something that could become quite tedious rather quickly

                      – MickyD
                      Feb 15 '15 at 17:40






                    • 1





                      Should the C++ proxy functions be surrounded by extern "C" { .... } or is it fine to do it purely in C++?

                      – divB
                      Apr 1 '15 at 6:26














                    • 1





                      The statement of "There is no way to directly use a C++ class in C# code" is not correct. A static C++ function works the same way as C-style function and the instance functions can be declared as ThisCall calling convention by adding ThisObject pointing to the instance itself as the first argument. For details, you may want to read my Blogs. You may also want to try our tool.(I am the author)

                      – xInterop
                      Apr 11 '14 at 1:09








                    • 2





                      Though a fine answer at the time, it's arguably better to use c++/CLI so as to avoid the manual creation of proxy functions - something that could become quite tedious rather quickly

                      – MickyD
                      Feb 15 '15 at 17:40






                    • 1





                      Should the C++ proxy functions be surrounded by extern "C" { .... } or is it fine to do it purely in C++?

                      – divB
                      Apr 1 '15 at 6:26








                    1




                    1





                    The statement of "There is no way to directly use a C++ class in C# code" is not correct. A static C++ function works the same way as C-style function and the instance functions can be declared as ThisCall calling convention by adding ThisObject pointing to the instance itself as the first argument. For details, you may want to read my Blogs. You may also want to try our tool.(I am the author)

                    – xInterop
                    Apr 11 '14 at 1:09







                    The statement of "There is no way to directly use a C++ class in C# code" is not correct. A static C++ function works the same way as C-style function and the instance functions can be declared as ThisCall calling convention by adding ThisObject pointing to the instance itself as the first argument. For details, you may want to read my Blogs. You may also want to try our tool.(I am the author)

                    – xInterop
                    Apr 11 '14 at 1:09






                    2




                    2





                    Though a fine answer at the time, it's arguably better to use c++/CLI so as to avoid the manual creation of proxy functions - something that could become quite tedious rather quickly

                    – MickyD
                    Feb 15 '15 at 17:40





                    Though a fine answer at the time, it's arguably better to use c++/CLI so as to avoid the manual creation of proxy functions - something that could become quite tedious rather quickly

                    – MickyD
                    Feb 15 '15 at 17:40




                    1




                    1





                    Should the C++ proxy functions be surrounded by extern "C" { .... } or is it fine to do it purely in C++?

                    – divB
                    Apr 1 '15 at 6:26





                    Should the C++ proxy functions be surrounded by extern "C" { .... } or is it fine to do it purely in C++?

                    – divB
                    Apr 1 '15 at 6:26













                    16














                    Marshal C++ Class and use the PInvoke



                    C++ Code ,ClassName.h



                    class __declspec(dllexport) CClassName
                    {
                    public:
                    CClassName();
                    ~CClassName();
                    void function();

                    };


                    C++ Code, ClassName.cpp



                    CClassName::CClassName()
                    {
                    }

                    CClassName::~CClassName()
                    {
                    }

                    void CClassName::function()
                    {
                    std::cout << "Bla bla bla" << std::endl;

                    }


                    C++ Code, ClassNameCaller.h file for the caller function



                    #include "ClassName.h"      

                    #ifdef __cplusplus
                    extern "C" {
                    #endif

                    extern __declspec(dllexport) CClassName* CreateClassName();

                    extern __declspec(dllexport) void DisposeClassName(CClassName* a_pObject);

                    extern __declspec(dllexport) void function(CClassName* a_pObject);


                    #ifdef __cplusplus
                    }
                    #endif


                    C++ Code, ClassNameCaller.cpp file for the caller function



                    #include "ClassNameCaller.h"


                    CClassName* CreateClassName()
                    {
                    return new CClassName();
                    }

                    void DisposeClassName(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    delete a_pObject;
                    a_pObject= NULL;
                    }
                    }

                    void function(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    a_pObject->function();
                    }
                    }


                    C# code



                    [DllImport("ClassNameDll.dll")]
                    static public extern IntPtr CreateClassName();

                    [DllImport("ClassNameDll.dll")]
                    static public extern void DisposeClassName(IntPtr pClassNameObject);

                    [DllImport("ClassNameDll.dll")]
                    static public extern void CallFunction(IntPtr pClassNameObject);

                    //use the functions
                    IntPtr pClassName = CreateClassName();

                    CallFunction(pClassName);

                    DisposeClassName(pClassName);

                    pClassName = IntPtr.Zero;





                    share|improve this answer





















                    • 2





                      Well written. :)

                      – Ehsan Ab
                      Sep 8 '16 at 10:26






                    • 1





                      Shouldn't there be a "dllexport" instead "dllimport" in the first file, ClassName.h?

                      – P.W.
                      Mar 7 '18 at 17:11











                    • Yes , It is used to export this class to .Net project so we can use the CClassName class

                      – Amir Twito
                      Mar 8 '18 at 5:20






                    • 1





                      This example really helped a lot, Thank you so much:-)

                      – Ashish Rana
                      Mar 28 '18 at 10:15











                    • Hi. Not sure if this is too late, but can you show a modification of your code where I can pass strings through the function, modify them and then return them to the c# code? I've been trying but it won't allow me to add type names in a_pObject->function(std::string args1);

                      – CausticLasagne
                      Nov 4 '18 at 20:29
















                    16














                    Marshal C++ Class and use the PInvoke



                    C++ Code ,ClassName.h



                    class __declspec(dllexport) CClassName
                    {
                    public:
                    CClassName();
                    ~CClassName();
                    void function();

                    };


                    C++ Code, ClassName.cpp



                    CClassName::CClassName()
                    {
                    }

                    CClassName::~CClassName()
                    {
                    }

                    void CClassName::function()
                    {
                    std::cout << "Bla bla bla" << std::endl;

                    }


                    C++ Code, ClassNameCaller.h file for the caller function



                    #include "ClassName.h"      

                    #ifdef __cplusplus
                    extern "C" {
                    #endif

                    extern __declspec(dllexport) CClassName* CreateClassName();

                    extern __declspec(dllexport) void DisposeClassName(CClassName* a_pObject);

                    extern __declspec(dllexport) void function(CClassName* a_pObject);


                    #ifdef __cplusplus
                    }
                    #endif


                    C++ Code, ClassNameCaller.cpp file for the caller function



                    #include "ClassNameCaller.h"


                    CClassName* CreateClassName()
                    {
                    return new CClassName();
                    }

                    void DisposeClassName(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    delete a_pObject;
                    a_pObject= NULL;
                    }
                    }

                    void function(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    a_pObject->function();
                    }
                    }


                    C# code



                    [DllImport("ClassNameDll.dll")]
                    static public extern IntPtr CreateClassName();

                    [DllImport("ClassNameDll.dll")]
                    static public extern void DisposeClassName(IntPtr pClassNameObject);

                    [DllImport("ClassNameDll.dll")]
                    static public extern void CallFunction(IntPtr pClassNameObject);

                    //use the functions
                    IntPtr pClassName = CreateClassName();

                    CallFunction(pClassName);

                    DisposeClassName(pClassName);

                    pClassName = IntPtr.Zero;





                    share|improve this answer





















                    • 2





                      Well written. :)

                      – Ehsan Ab
                      Sep 8 '16 at 10:26






                    • 1





                      Shouldn't there be a "dllexport" instead "dllimport" in the first file, ClassName.h?

                      – P.W.
                      Mar 7 '18 at 17:11











                    • Yes , It is used to export this class to .Net project so we can use the CClassName class

                      – Amir Twito
                      Mar 8 '18 at 5:20






                    • 1





                      This example really helped a lot, Thank you so much:-)

                      – Ashish Rana
                      Mar 28 '18 at 10:15











                    • Hi. Not sure if this is too late, but can you show a modification of your code where I can pass strings through the function, modify them and then return them to the c# code? I've been trying but it won't allow me to add type names in a_pObject->function(std::string args1);

                      – CausticLasagne
                      Nov 4 '18 at 20:29














                    16












                    16








                    16







                    Marshal C++ Class and use the PInvoke



                    C++ Code ,ClassName.h



                    class __declspec(dllexport) CClassName
                    {
                    public:
                    CClassName();
                    ~CClassName();
                    void function();

                    };


                    C++ Code, ClassName.cpp



                    CClassName::CClassName()
                    {
                    }

                    CClassName::~CClassName()
                    {
                    }

                    void CClassName::function()
                    {
                    std::cout << "Bla bla bla" << std::endl;

                    }


                    C++ Code, ClassNameCaller.h file for the caller function



                    #include "ClassName.h"      

                    #ifdef __cplusplus
                    extern "C" {
                    #endif

                    extern __declspec(dllexport) CClassName* CreateClassName();

                    extern __declspec(dllexport) void DisposeClassName(CClassName* a_pObject);

                    extern __declspec(dllexport) void function(CClassName* a_pObject);


                    #ifdef __cplusplus
                    }
                    #endif


                    C++ Code, ClassNameCaller.cpp file for the caller function



                    #include "ClassNameCaller.h"


                    CClassName* CreateClassName()
                    {
                    return new CClassName();
                    }

                    void DisposeClassName(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    delete a_pObject;
                    a_pObject= NULL;
                    }
                    }

                    void function(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    a_pObject->function();
                    }
                    }


                    C# code



                    [DllImport("ClassNameDll.dll")]
                    static public extern IntPtr CreateClassName();

                    [DllImport("ClassNameDll.dll")]
                    static public extern void DisposeClassName(IntPtr pClassNameObject);

                    [DllImport("ClassNameDll.dll")]
                    static public extern void CallFunction(IntPtr pClassNameObject);

                    //use the functions
                    IntPtr pClassName = CreateClassName();

                    CallFunction(pClassName);

                    DisposeClassName(pClassName);

                    pClassName = IntPtr.Zero;





                    share|improve this answer















                    Marshal C++ Class and use the PInvoke



                    C++ Code ,ClassName.h



                    class __declspec(dllexport) CClassName
                    {
                    public:
                    CClassName();
                    ~CClassName();
                    void function();

                    };


                    C++ Code, ClassName.cpp



                    CClassName::CClassName()
                    {
                    }

                    CClassName::~CClassName()
                    {
                    }

                    void CClassName::function()
                    {
                    std::cout << "Bla bla bla" << std::endl;

                    }


                    C++ Code, ClassNameCaller.h file for the caller function



                    #include "ClassName.h"      

                    #ifdef __cplusplus
                    extern "C" {
                    #endif

                    extern __declspec(dllexport) CClassName* CreateClassName();

                    extern __declspec(dllexport) void DisposeClassName(CClassName* a_pObject);

                    extern __declspec(dllexport) void function(CClassName* a_pObject);


                    #ifdef __cplusplus
                    }
                    #endif


                    C++ Code, ClassNameCaller.cpp file for the caller function



                    #include "ClassNameCaller.h"


                    CClassName* CreateClassName()
                    {
                    return new CClassName();
                    }

                    void DisposeClassName(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    delete a_pObject;
                    a_pObject= NULL;
                    }
                    }

                    void function(CClassName* a_pObject)
                    {
                    if(a_pObject!= NULL)
                    {
                    a_pObject->function();
                    }
                    }


                    C# code



                    [DllImport("ClassNameDll.dll")]
                    static public extern IntPtr CreateClassName();

                    [DllImport("ClassNameDll.dll")]
                    static public extern void DisposeClassName(IntPtr pClassNameObject);

                    [DllImport("ClassNameDll.dll")]
                    static public extern void CallFunction(IntPtr pClassNameObject);

                    //use the functions
                    IntPtr pClassName = CreateClassName();

                    CallFunction(pClassName);

                    DisposeClassName(pClassName);

                    pClassName = IntPtr.Zero;






                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Mar 8 '18 at 5:19

























                    answered Apr 12 '16 at 12:59









                    Amir TwitoAmir Twito

                    82311616




                    82311616








                    • 2





                      Well written. :)

                      – Ehsan Ab
                      Sep 8 '16 at 10:26






                    • 1





                      Shouldn't there be a "dllexport" instead "dllimport" in the first file, ClassName.h?

                      – P.W.
                      Mar 7 '18 at 17:11











                    • Yes , It is used to export this class to .Net project so we can use the CClassName class

                      – Amir Twito
                      Mar 8 '18 at 5:20






                    • 1





                      This example really helped a lot, Thank you so much:-)

                      – Ashish Rana
                      Mar 28 '18 at 10:15











                    • Hi. Not sure if this is too late, but can you show a modification of your code where I can pass strings through the function, modify them and then return them to the c# code? I've been trying but it won't allow me to add type names in a_pObject->function(std::string args1);

                      – CausticLasagne
                      Nov 4 '18 at 20:29














                    • 2





                      Well written. :)

                      – Ehsan Ab
                      Sep 8 '16 at 10:26






                    • 1





                      Shouldn't there be a "dllexport" instead "dllimport" in the first file, ClassName.h?

                      – P.W.
                      Mar 7 '18 at 17:11











                    • Yes , It is used to export this class to .Net project so we can use the CClassName class

                      – Amir Twito
                      Mar 8 '18 at 5:20






                    • 1





                      This example really helped a lot, Thank you so much:-)

                      – Ashish Rana
                      Mar 28 '18 at 10:15











                    • Hi. Not sure if this is too late, but can you show a modification of your code where I can pass strings through the function, modify them and then return them to the c# code? I've been trying but it won't allow me to add type names in a_pObject->function(std::string args1);

                      – CausticLasagne
                      Nov 4 '18 at 20:29








                    2




                    2





                    Well written. :)

                    – Ehsan Ab
                    Sep 8 '16 at 10:26





                    Well written. :)

                    – Ehsan Ab
                    Sep 8 '16 at 10:26




                    1




                    1





                    Shouldn't there be a "dllexport" instead "dllimport" in the first file, ClassName.h?

                    – P.W.
                    Mar 7 '18 at 17:11





                    Shouldn't there be a "dllexport" instead "dllimport" in the first file, ClassName.h?

                    – P.W.
                    Mar 7 '18 at 17:11













                    Yes , It is used to export this class to .Net project so we can use the CClassName class

                    – Amir Twito
                    Mar 8 '18 at 5:20





                    Yes , It is used to export this class to .Net project so we can use the CClassName class

                    – Amir Twito
                    Mar 8 '18 at 5:20




                    1




                    1





                    This example really helped a lot, Thank you so much:-)

                    – Ashish Rana
                    Mar 28 '18 at 10:15





                    This example really helped a lot, Thank you so much:-)

                    – Ashish Rana
                    Mar 28 '18 at 10:15













                    Hi. Not sure if this is too late, but can you show a modification of your code where I can pass strings through the function, modify them and then return them to the c# code? I've been trying but it won't allow me to add type names in a_pObject->function(std::string args1);

                    – CausticLasagne
                    Nov 4 '18 at 20:29





                    Hi. Not sure if this is too late, but can you show a modification of your code where I can pass strings through the function, modify them and then return them to the c# code? I've been trying but it won't allow me to add type names in a_pObject->function(std::string args1);

                    – CausticLasagne
                    Nov 4 '18 at 20:29











                    4














                    Here is a sample how to call C++ class method from VB - for C# you only have to rewrite the sample program in Step 4.






                    share|improve this answer




























                      4














                      Here is a sample how to call C++ class method from VB - for C# you only have to rewrite the sample program in Step 4.






                      share|improve this answer


























                        4












                        4








                        4







                        Here is a sample how to call C++ class method from VB - for C# you only have to rewrite the sample program in Step 4.






                        share|improve this answer













                        Here is a sample how to call C++ class method from VB - for C# you only have to rewrite the sample program in Step 4.







                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered Nov 24 '08 at 19:05









                        Dmitry KhalatovDmitry Khalatov

                        2,84232837




                        2,84232837























                            3














                            myfile.i



                            %module learnaboutswig

                            class A

                            {

                            public:

                            void boringfunction(char *charstr);
                            };


                            download swig from swig.org



                            swig -c++ -csharp myfile.i



                            look at the output, see if it will work for you.






                            share|improve this answer






























                              3














                              myfile.i



                              %module learnaboutswig

                              class A

                              {

                              public:

                              void boringfunction(char *charstr);
                              };


                              download swig from swig.org



                              swig -c++ -csharp myfile.i



                              look at the output, see if it will work for you.






                              share|improve this answer




























                                3












                                3








                                3







                                myfile.i



                                %module learnaboutswig

                                class A

                                {

                                public:

                                void boringfunction(char *charstr);
                                };


                                download swig from swig.org



                                swig -c++ -csharp myfile.i



                                look at the output, see if it will work for you.






                                share|improve this answer















                                myfile.i



                                %module learnaboutswig

                                class A

                                {

                                public:

                                void boringfunction(char *charstr);
                                };


                                download swig from swig.org



                                swig -c++ -csharp myfile.i



                                look at the output, see if it will work for you.







                                share|improve this answer














                                share|improve this answer



                                share|improve this answer








                                edited Feb 5 '14 at 18:23

























                                answered Mar 26 '09 at 19:57









                                bluepoisondartfrogbluepoisondartfrog

                                5,4651778143




                                5,4651778143























                                    2














                                    You may need to write an intermediary DLL (in C++, perhaps) that handles this for you and exposes the interface you need. Your DLL would be in charge of loading the 3rd party DLL, creating an instance of this C++ object, and exposing its member functions as needed via whatever API you design. You would then use P/Invoke to get at your API and cleanly manipulate the object.



                                    Note: For the API of your DLL, try keeping the data types limited to primitives (long, int, char*, etc.) to prevent module boundary issues.






                                    share|improve this answer




























                                      2














                                      You may need to write an intermediary DLL (in C++, perhaps) that handles this for you and exposes the interface you need. Your DLL would be in charge of loading the 3rd party DLL, creating an instance of this C++ object, and exposing its member functions as needed via whatever API you design. You would then use P/Invoke to get at your API and cleanly manipulate the object.



                                      Note: For the API of your DLL, try keeping the data types limited to primitives (long, int, char*, etc.) to prevent module boundary issues.






                                      share|improve this answer


























                                        2












                                        2








                                        2







                                        You may need to write an intermediary DLL (in C++, perhaps) that handles this for you and exposes the interface you need. Your DLL would be in charge of loading the 3rd party DLL, creating an instance of this C++ object, and exposing its member functions as needed via whatever API you design. You would then use P/Invoke to get at your API and cleanly manipulate the object.



                                        Note: For the API of your DLL, try keeping the data types limited to primitives (long, int, char*, etc.) to prevent module boundary issues.






                                        share|improve this answer













                                        You may need to write an intermediary DLL (in C++, perhaps) that handles this for you and exposes the interface you need. Your DLL would be in charge of loading the 3rd party DLL, creating an instance of this C++ object, and exposing its member functions as needed via whatever API you design. You would then use P/Invoke to get at your API and cleanly manipulate the object.



                                        Note: For the API of your DLL, try keeping the data types limited to primitives (long, int, char*, etc.) to prevent module boundary issues.







                                        share|improve this answer












                                        share|improve this answer



                                        share|improve this answer










                                        answered Nov 24 '08 at 18:56









                                        BrianBrian

                                        2,48442438




                                        2,48442438























                                            2














                                            I agree with JaredPar.
                                            Creating instances of unmanaged classes in managed code should not be possible.



                                            Another thing is - if you could recompile the DLL in managed C++ or make a COM component out of it, it would be much easier/






                                            share|improve this answer




























                                              2














                                              I agree with JaredPar.
                                              Creating instances of unmanaged classes in managed code should not be possible.



                                              Another thing is - if you could recompile the DLL in managed C++ or make a COM component out of it, it would be much easier/






                                              share|improve this answer


























                                                2












                                                2








                                                2







                                                I agree with JaredPar.
                                                Creating instances of unmanaged classes in managed code should not be possible.



                                                Another thing is - if you could recompile the DLL in managed C++ or make a COM component out of it, it would be much easier/






                                                share|improve this answer













                                                I agree with JaredPar.
                                                Creating instances of unmanaged classes in managed code should not be possible.



                                                Another thing is - if you could recompile the DLL in managed C++ or make a COM component out of it, it would be much easier/







                                                share|improve this answer












                                                share|improve this answer



                                                share|improve this answer










                                                answered Nov 24 '08 at 18:58









                                                badbadboybadbadboy

                                                2,29742842




                                                2,29742842























                                                    2














                                                    The way I've done this is by creating a thin Managed C++ wrapper around my unmanaged C++ DLL. The managed wrapper contains "proxy" classes that wrap around the unmanaged code exposing the interface that's needed by the .NET application.
                                                    This is a bit of double work but it allows quite seamless operation in normal environments. Things do get trickier with dependencies in some circumstances (such as ASP.NET) but you will probably not run into that.






                                                    share|improve this answer




























                                                      2














                                                      The way I've done this is by creating a thin Managed C++ wrapper around my unmanaged C++ DLL. The managed wrapper contains "proxy" classes that wrap around the unmanaged code exposing the interface that's needed by the .NET application.
                                                      This is a bit of double work but it allows quite seamless operation in normal environments. Things do get trickier with dependencies in some circumstances (such as ASP.NET) but you will probably not run into that.






                                                      share|improve this answer


























                                                        2












                                                        2








                                                        2







                                                        The way I've done this is by creating a thin Managed C++ wrapper around my unmanaged C++ DLL. The managed wrapper contains "proxy" classes that wrap around the unmanaged code exposing the interface that's needed by the .NET application.
                                                        This is a bit of double work but it allows quite seamless operation in normal environments. Things do get trickier with dependencies in some circumstances (such as ASP.NET) but you will probably not run into that.






                                                        share|improve this answer













                                                        The way I've done this is by creating a thin Managed C++ wrapper around my unmanaged C++ DLL. The managed wrapper contains "proxy" classes that wrap around the unmanaged code exposing the interface that's needed by the .NET application.
                                                        This is a bit of double work but it allows quite seamless operation in normal environments. Things do get trickier with dependencies in some circumstances (such as ASP.NET) but you will probably not run into that.







                                                        share|improve this answer












                                                        share|improve this answer



                                                        share|improve this answer










                                                        answered Nov 25 '08 at 9:30









                                                        Joris TimmermansJoris Timmermans

                                                        9,83424067




                                                        9,83424067






























                                                            draft saved

                                                            draft discarded




















































                                                            Thanks for contributing an answer to Stack Overflow!


                                                            • Please be sure to answer the question. Provide details and share your research!

                                                            But avoid



                                                            • Asking for help, clarification, or responding to other answers.

                                                            • Making statements based on opinion; back them up with references or personal experience.


                                                            To learn more, see our tips on writing great answers.




                                                            draft saved


                                                            draft discarded














                                                            StackExchange.ready(
                                                            function () {
                                                            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f315051%2fusing-a-class-defined-in-a-c-dll-in-c-sharp-code%23new-answer', 'question_page');
                                                            }
                                                            );

                                                            Post as a guest















                                                            Required, but never shown





















































                                                            Required, but never shown














                                                            Required, but never shown












                                                            Required, but never shown







                                                            Required, but never shown

































                                                            Required, but never shown














                                                            Required, but never shown












                                                            Required, but never shown







                                                            Required, but never shown







                                                            Popular posts from this blog

                                                            Xamarin.iOS Cant Deploy on Iphone

                                                            Glorious Revolution

                                                            Dulmage-Mendelsohn matrix decomposition in Python