Solved

How to use a c#.net dll in vc++6 programmes?

Posted on 2003-11-13
8
481 Views
Last Modified: 2012-06-21
  I am trying to figure out if it is possible to use a c#.net dll in vc++6 programmes. So far i have created a dll, a tlb using the tlbexp.exe and a RES file using the rc.exe. I managed to import the tlb file in a c++ program but i cannot use any  of my c# class methods.
Is it possible to use c#.net code in vc++6 and if yes how can i do that?
For instance what do i need to do in order to use these classes in vc++6:

using System;

namespace Operations
{
      public class Addition
      {
            public Addition()
            {                  
            }
            public double Add(double sum1, double sum2)
            {
                  return sum1 + sum2;
            }
      }
      
      public class Multiplication
      {
            public Multiplication()
            {                  
            }
            public static double Multiply(double multiplier, double multiplicand)
            {
                  return multiplier*multiplicand;
            }
      }
}
0
Comment
Question by:Celetron
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
8 Comments
 
LVL 10

Expert Comment

by:smegghead
ID: 9739329
have you tried calling RegAsm ??

0
 
LVL 1

Expert Comment

by:bluedaisydawg
ID: 9740692
I'm having a similar problem.  This is what I did:

- Make sure you are compiling the DLL with the Com interop flag set to true (right click on the solution, pick properties, Configuration properties, build)

- Then I did this: http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B815808

- Add this to your C++ file:
#import "PATH\DLLNAME.tlb"
using namespace DLLNAMESPACE;

You'll then be able to see all your stuff from C++.

 
0
 
LVL 1

Expert Comment

by:bluedaisydawg
ID: 9741265
Also in your C# you need to have something like this:

namespace MyNamespace
{
      /// <summary>
      /// Summary description for Class1.
      /// </summary>
      public interface IManagedInterface
      {
              bool myFunction(string spName, string connectionString);
      }

      public class Class1:IManagedInterface
      {
                         public bool myFunction(string spName, string connectionString)
                        {
                                // function stuff here
                         }


From C++ do this:

      ::CoInitialize(NULL);


      _Class1Ptr p;

      p.CreateInstance("Mynamespace.Class1");


      IManagedInterfacePtr t = p.GetInterfacePtr();

      t->executeStoredProcedure("test", "test");


      CoUninitialize();


Put those two comments together and it should work just fine.  I just this minute got this working myself.
0
Salesforce Has Never Been Easier

Improve and reinforce salesforce training & adoption using WalkMe's digital adoption platform. Start saving on costly employee training by creating fast intuitive Walk-Thrus for Salesforce. Claim your Free Account Now

 

Author Comment

by:Celetron
ID: 9747038
I did what you said bluedaisydawg and i can see now my class methods but when i am running the program i always get an exception:

Debug Error!

Program: program path

Abnormal program termination

That happens when the program reaches the following line:
 t->executeStoredProcedure("test", "test");
or :
a = t->Add(1, 1);      in my code

The problem seems to be the interface which is never implemented and in fact remains NULL during the whole process. From what i understand the "p.CreateInstance("Operations.Addition");" fails to create the instance, and when the program tries to excecute the "t->Add(1, 1)" it crashes cos it doesn't know what to do with it...

i am posting my code in case i did something wrong and i cannot see it...

//
//   C#.NET code
//

using System;

namespace Operations
{
      public interface IManagedInterface
      {
            double Add(double sum1, double sum2);
      }

      public class Addition:IManagedInterface
      {
            public Addition()
            {                  
            }

            public double Add(double sum1, double sum2)
            {
                  return sum1 + sum2;
            }
      }
      
}

//
//   VC++6 code
//
#include "stdafx.h"
#import  "Operations.tlb"

using namespace Operations;

int main(int argc, char* argv[])
{
      double a = 0;
      ::CoInitialize(NULL);

      _AdditionPtr p;

      p.CreateInstance("Operations.Addition");

      IManagedInterfacePtr t = p.GetInterfacePtr();


      a = t->Add(1, 1);     // It crashes here...

      CoUninitialize();

      printf("%d", a);
      getchar();
      return 0;
}

0
 
LVL 1

Accepted Solution

by:
bluedaisydawg earned 250 total points
ID: 9749200
It looks ok - when you step through p is still set to nothing after the CreateInstance though right?  Try

p.CreateInstance(__uuidof(Operations.Addition)

see if that helps.


0
 

Author Comment

by:Celetron
ID: 9769451
Nope... p is still NULL... Does it work at your pc?
0
 
LVL 1

Expert Comment

by:bluedaisydawg
ID: 9771916
yes - the one i have is working...  try this:

go to Programs->Microsoft Visual Studio .NET -> Visual Studio.NET tools ->Visual Studio .NET Command Prompt

Then type

regasm PATH\LIBNAME.dll

0
 

Author Comment

by:Celetron
ID: 9777622
Ok it worked. In fact it should work before as well but instead of having
p.CreateInstance(__uuidof(Addition));
i had
p.CreateInstance(__uuidof(_Addition)); ....

Thx for the help bluedaisydawg.

By the way, do you know if it is possible to use c#.net static methods as well???
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Article by: Ivo
C# And Nullable Types Since 2.0 C# has Nullable(T) Generic Structure. The idea behind is to allow value type objects to have null values just like reference types have. This concerns scenarios where not all data sources have values (like a databa…
Introduction Although it is an old technology, serial ports are still being used by many hardware manufacturers. If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the serial ports.  I needed to…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an antispam), the admini…

751 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question