Topaz Filer: if you use e-mail for business, we can save you money and decrease your risk.
How to integrate a C++ Dll into a C# .Net Project?
Messages   Related Types
This message was discovered on microsoft.public.dotnet.faqs.
Responses highlighted in red are from those people who are likely to be able to contribute good, authoratitive information to this discussion. They include Microsoft employees, MVP's and others who IMHO contribute well to these kinds of discussions.

Eric
Hi all,

I'd like to know if it's possible and what are the consequences of
integrating a C++ dll (simple one with a couple a classes, the use of MFC
classes + use of RASAPI32.dll that is dynamically linked to my dll) to a C#
..Net project...
In fact we have started a project with some business C++ dll modules and now
we want to integrate these objects to a .Net application but we don't know
if we have to modify our dlls..

If you have some links explaining this kind of integration this would also
be great..

Thanks very much

Eric

Reply to this message...
Vote that this is a GOOD answer...
 
Auto-following on Twitter
Ubuntu and XP on one “desktop”
 
    
Dale \(MVP\)
Use DLLImport and Extern.

Indicates that the attributed method is implemented as an export from an
unmanaged DLL.

For a list of all members of this type, see DllImportAttribute Members.

System.Object
System.Attribute
System.Runtime.InteropServices.DllImportAttribute

[Visual Basic]
<AttributeUsage(AttributeTargets.Method)>
NotInheritable Public Class DllImportAttribute
Inherits Attribute
[C#]
[AttributeUsage(AttributeTargets.Method)]
public sealed class DllImportAttribute : Attribute
[C++]
[AttributeUsage(AttributeTargets.Method)]
public __gc __sealed class DllImportAttribute : public Attribute
[JScript]
public
AttributeUsage(AttributeTargets.Method)
class DllImportAttribute extends Attribute
Thread Safety
Any public static (Shared in Visual Basic) members of this type are safe for
multithreaded operations. Any instance members are not guaranteed to be
thread safe.

Remarks
You can apply this attribute to methods.

This attribute provides the information needed to call an exported function
in an unmanaged DLL.

Example
[Visual Basic]
<DllImport("KERNEL32.DLL", EntryPoint := "MoveFileW", _
SetLastError := True, CharSet := CharSet.Unicode, _
ExactSpelling := True, _
CallingConvention := CallingConvention.StdCall)> _
Public Shared Function MoveFile(src As String, dst As String) As Boolean
' Leave function empty - DLLImport attribute forwards calls to MoveFile
to
' MoveFileW in KERNEL32.DLL.
End Function
[C#]
[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);
[C++, JScript] No example is available for C++ or JScript. To view a Visual
Basic or C# example, click the Language Filter button in the upper-left
corner of the page.

Requirements
Namespace: System.Runtime.InteropServices

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows
2000, Windows XP Home Edition, Windows XP Professional, Windows .NET Server
family

Assembly: Mscorlib (in Mscorlib.dll)

Use the extern modifier in a method declaration to indicate that the method
is implemented externally. A common use of the extern modifier is with the
DllImport attribute. (See B.8 The DllImport attribute for more information.)

It is an error to use the abstract and extern modifiers together to modify
the same member. Using the extern modifier means that the method is
implemented outside the C# code, while using the abstract modifier means
that the method implementation is not provided in the class.

Because an external method declaration provides no actual implementation,
there is no method body; the method declaration simply ends with a semicolon
and there are no braces ({ }) following the signature. For example:

public static extern int MyMethod(int x);
Note The extern keyword is more limited in use than in C++. To compare
with the C++ keyword, see Using extern to Specify Linkage in the C++
Language Reference.
For more information on external methods, see 10.5.7 External methods.

For more information on attributes, see 17. Attributes.

Example
In this example, the program receives a string from the user and displays it
inside a message box. The program uses the MessageBox method imported from
the User32.dll library.

using System;
using System.Runtime.InteropServices;
class MyClass
{
[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);

public static int Main()
{
string myString;
Console.Write("Enter your message: ");
myString = Console.ReadLine();
return MessageBox(0, myString, "My Message Box", 0);
}
}

Sample RunEnter your message: Where do you want to go today?When the
previous text is entered, a message box that contains the text will pop up
on the screen.ExampleThis example uses two files, CM.cs and Cmdll.c, to
demonstrate extern. The C file is an external DLL that is invoked from
within the C# program. File: Cmdll.c// cmdll.c
// compile with: /LD /MD
int __declspec(dllexport) MyMethod(int i)
{
return i*10;
}File: CM.cs// cm.cs
using System;
using System.Runtime.InteropServices;
public class MyClass
{
[DllImport("Cmdll.dll")]
public static extern int MyMethod(int x);
public static void Main()
{
Console.WriteLine("MyMethod() returns {0}.", MyMethod(5));
}
}OutputMyMethod() returns 50.CompilationTo build the project, use the
following steps: a.. Compile Cmdll.c to a DLL using the Visual C++ command
line: cl /LD /MD Cmdll.cb.. Compile CM.cs using the command line: csc
CM.csThis will create the executable file CM.exe. When you run this program,
MyMethod will pass the value 5 to the DLL file, which returns the value
multiplied by 10.
"Eric" <Click here to reveal e-mail address> wrote in message
news:uvvpVew2BHA.1840@tkmsftngp03...
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
Outlook interop - stopping user properties appearing on Outlook message print
Seriously, why is “cut and paste” majorly newsworthy???
 
    
Joel
DllImport works great for exported functions however it does not (correct me
if I'm wrong) allow you to create instances of C++ classes.

I have solved this problem by creating a managed C++ class library to write
managed C++ classes to wrap the unmanaged classes. A bit of a pain but what
are the alternatives.

Joel

"Dale (MVP)" <Click here to reveal e-mail address> wrote in message
news:OLrSTNy2BHA.2332@tkmsftngp03...
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
 
    
Dale \(MVP\)
Right

"Joel" <Click here to reveal e-mail address> wrote in message
news:OKf0kPy2BHA.1780@tkmsftngp03...
> DllImport works great for exported functions however it does not (correct
me
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
Email Archiving and Email Filing - what’s the difference?
Web-based task/todo list management
 
    
Eric
My Dll is containing classes...
In this case would it be a could idea to convert my simple Dll into a COM
component that I can include as a reference to my C# project?

"Dale (MVP)" <Click here to reveal e-mail address> wrote in message
news:ep9h#Zy2BHA.2104@tkmsftngp07...
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
Open source windows
The Law Society’s guidelines on e-mail management
 
    
NETMaster (VIP)
>> convert my simple Dll into a COM component
Yes if possible. I'm not so sure if a MFC-DLL can be built as COM component?
(AFAIK, ATL is a much better choice to build COM objects)

>> can include as a reference to my C# project?
Yes, if you have a 'type library' (.TLB file or embedded) of your COM component.

"Eric" <Click here to reveal e-mail address> wrote in message news:u9CpBg72BHA.2564@tkmsftngp03...
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
 
    
Eric
GOOD ANSWER
Thanks

My last question,

Is it possible to implement C++ classes into a COM interface?
I want to turn my "simple" DLL into a COM component using ATL wizard and MFC
support... I understand how it works with exported functions that I put in
the COM Interface (using HRESULT return type etc..) but can I put C++
classes in my COM Interface? how to do that? How the member will be accessed
from the COM client?
Thanks
Eric

"NETMaster" <Click here to reveal e-mail address> wrote in message
news:#kHQHS$2BHA.2760@tkmsftngp04...
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer... (2 votes from other users already)
 
 
    
NETMaster (VIP)
>> Is it possible to implement C++ classes into a COM interface?
No, not directly.
You have to write a COM-wrapper-component for your class.
And you have to make sure you only use oleautomation compliant
function-parameters, if you would like zero-effort integration in C#.

Please note, the step from C++/MFC to C#/.NET is a new generation!
Only two choices left:
- write wrappers (Managed C++ / COM)
- complete rewrite in C#.

"Eric" <Click here to reveal e-mail address> wrote in message news:ep5Yz#$2BHA.2148@tkmsftngp02...
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
 
    
Sergiy Mesropyan
You may want to use Managed C++ extensions.
The standard case would be:
1. You write managed C++ extension as dll.
2. Dll contains .NET classes written in C++ that call your native C++
classes.
3. Your .NET components call classes (proxies) in Managed C++ dll.

For more information look at:
MSDN->VisualStudio.NET->Visual C++->managed Extensions for C++ Programming.

Your scenarion is described on the first page.

The Functional spec for managed extensions can be found in
Program Files\Microsoft Visual Studio .NET\VC7\ManagedExtensionsSpec.doc

I hope this helps.

Sergiy Mesropyan.

"Eric" <Click here to reveal e-mail address> wrote in message
news:uvvpVew2BHA.1840@tkmsftngp03...
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
 
    
Neil Taylor \(ISI\)
"Sergiy Mesropyan" <Click here to reveal e-mail address> wrote in message
news:eeuRkMC3BHA.1888@tkmsftngp04...
[Original message clipped]

I'm trying to do something similar, but with a C-DLL (no classes, just C
compatible functions)

I can do the DLL import but only by quoting the abs. path of the DLL, or by
placing the DLL into the Windows PATH; and by PATH I find "." to mean the
location where the test application is running.

I want to be able to place a copy of the .NET wrapper and the DLL onto a
target machine, and let clients write an .NET App to use the supplied .NET
stuff + DLL without faffing with PATH or copying files.

Reply to this message...
Vote that this is a GOOD answer...
 
Google Docs… no.
Twitter Elite
 
    
Sergiy Mesropyan
[Skiped]
[Original message clipped]

System folder during installation
[Original message clipped]

Reply to this message...
Vote that this is a GOOD answer...
 
Auto-following on Twitter
Ubuntu and XP on one “desktop”
 
    
Alex Groysman
GOOD ANSWER
After I created a dll,say one.dll
I check it with dumpbin
dumpbin /exports one.dll
I get my function printed:
like _function@8

So i guess dll is fine.
Now I try to use it C# wrapper like:
DLLImport("one.dll")]
Now I call to function from dll

d = function(...);

When i get to a call to function I get an error message:
The application failed to start because oneapi.dll was not found. Re-installing the application may fix this problem.

WHat a hell is oneapi.dll?
Why it says failed to start when 60% of program already ran and problem ocures only when i call dll function?

--------------------------------
From: Alex Groysman
Reply to this message...
Vote that this is a GOOD answer... (1 vote from another user already)
 
 
    
bob lyons
I'm doing something similar, but it involves importing a full object from c++ into c#. I've created a web service in c# asp.net and have a function in a c++ i need to call.

problem is, in order to call said function, a new object must be instantiated. any suggestions?

--------------------------------
From: bob lyons
Reply to this message...
Vote that this is a GOOD answer...
 
Outlook interop - stopping user properties appearing on Outlook message print
Seriously, why is “cut and paste” majorly newsworthy???
 
 
System.Attribute
System.AttributeTargets
System.Console
System.Object
System.Runtime.InteropServices.CallingConvention
System.Runtime.InteropServices.CharSet
System.Runtime.InteropServices.DllImportAttribute
System.Windows.Forms.MessageBox




Ad
BootFX
Reliable and powerful .NET application framework.
Recession Busting Bespoke Software
Get through the recession by investing in bespoke software to decrease costs and create commercial opportunities.
Other DN247 Network Sites
.NET 247
SQL Server Wins
Old Skool Developer
 
Copyright © AMX Software Ltd 2008-2009. Portions copyright © Matthew Baxter-Reynolds 2001-2009. All rights reserved.
Contact Us - Terms of Use - Privacy Policy - .NET 247 is a member of the DN247 Network - 4.0.30129.1734