all groups > dotnet clr > august 2007 >
You're in the

dotnet clr

group:

Using managed code in unmanaged app


Using managed code in unmanaged app Schemer
8/8/2007 5:51:18 PM
dotnet clr: Hello,

I am interested in calling managed code from an unmanaged app. I have been
able to do it using a C++ wrapper to call in to a C# dll using
ExecuteInDefaultAppDomain(). That is a pretty restrictive method, though.

Is there a way to use an arbitrary managed code library from unmanaged code?

TIA for any info.

Re: Using managed code in unmanaged app Sheng Jiang[MVP]
8/8/2007 6:39:25 PM
use CLR host APIs
see http://msdn.microsoft.com/msdnmag/issues/06/08/CLRInsideOut/default.aspx

--
Sheng Jiang
Microsoft MVP in VC++
[quoted text, click to view]

RE: Using managed code in unmanaged app jetan NO[at]SPAM online.microsoft.com (
8/9/2007 12:00:00 AM
Hi Schemer,

There are 2 ways to use managed class assembly from native code: COM
interop and CLR hosting. "Sheng Jiang[MVP]" has provided the link regarding
CLR hosting.

Using COM interop, you may use regasm.exe to read the metadata of the
assembly add entries into the registry. When a COM client calls a .NET
object, the .NET Framework will create a COM callable wrapper (CCW). COM
clients use the CCW as a proxy for the managed object. Please refer to the
articles for details:
"Exposing .NET Components to COM"
http://www.codeproject.com/dotnet/nettocom.asp
".NET Interoperability - Calling a .NET Component from a COM Component"
http://www.devcity.net/PrintArticle.aspx?ArticleID=28
".NET Interop: Get Ready for Microsoft .NET by Using Wrappers to Interact
with COM-based Applications"
http://msdn.microsoft.com/msdnmag/issues/01/08/interop/

Hope this helps.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.


Re: Using managed code in unmanaged app Schemer
8/9/2007 8:45:30 AM
[quoted text, click to view]

Thanks for the reply. It is from that article that I learned about
ExecuteInDefaultAppDomain().
However, methods called via ExecuteInDefaultAppDomain() must have a specific
signature:
static int pwzMethodName (String pwzArgument)

Is there another technique for calling managed code from unmanaged, without
the restrictions of ExecuteInDefaultAppDomain?

Re: Using managed code in unmanaged app jetan NO[at]SPAM online.microsoft.com (
8/11/2007 12:00:00 AM
Hi Schemer,

The v2.0 hosting APIs are really all about using the AppDomainManager which
will get loaded into your process. You can have the AppDomainManager
P/Invoke back into your host and pass a delegate out that you can then call
(just make sure to pin it if you're going to keep it alive for longer then
the duration of the call).

Alternately you could look at
System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate and
GetDelegateForFunctionPointer to marshal by hand delegates back and forth
between the two sides.

A more general way is through a COM interface implemented by a managed
type. You create an instance of the type by calling
AppDomain.::CreateInstanceAndUnwrap(), then QueryInterface for the COM
interface, and do normal COM method calls on it.

Thanks.

Best regards,
Jeffrey Tan
Microsoft Online Community Support
==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.
AddThis Social Bookmark Button