Is it possible to use a DLL created using C# in an

2019-02-17 11:15发布

I have a DLL that I wrote in C# and I want to use it both with C# applications and applications written in unmanaged VC++. Is this possible?

标签: c# c++ dll
4条回答
看我几分像从前
2楼-- · 2019-02-17 11:33

There is more than just COM interop, the MSDN FAQ also lists lesser known methods:

2.2 How do I call .NET assembly from native Visual C++?

There are basically four methods to call .NET assembly from native VC++ code. Microsoft All-In-One Code Framework has working examples that demonstrate the methods.

  1. Native VC++ module calls CLR Hosting APIs to host CLR, load and call the .NET assembly. (All-In-One Code Framework Sample Code: CppHostCLR)

  2. If the .NET assembly can be exposed as a COM component, native VC++ module can call into the .NET assembly through .NET – COM interop. (All-In-One Code Framework Sample Code: CppCOMClient)

  3. Reverse PInvoke: the managed code call native passing a delegate the native code can call back. (All-In-One Code Framework Sample Code: CSPInvokeDll)

  4. If the module containing native VC++ code is allowed to enable CLR, the native VC++ code can call .NET assembly directly through the “It Just Works”, or “IJW”, mechanism. (All-In-One Code Framework Sample Code: CppCLIWrapLib)

查看更多
小情绪 Triste *
3楼-- · 2019-02-17 11:34

You can make the C# assembly visible to COM, and use it that way.

On your C# project properties, under the "Assembly Information" button, select "Make COM Visible".

There are numerous ways to access COM objects from Native C++, the easiest/best way depends on what your doing and how you're doing it.

查看更多
Summer. ? 凉城
4楼-- · 2019-02-17 11:43

To supplement other answers here, here's the MS support article which describes your scenario.

http://support.microsoft.com/kb/828736

查看更多
走好不送
5楼-- · 2019-02-17 11:45

Well, seems I have to bring up my unmanaged exports again. ;-)

Just answered a similar question 2 days ago. This totally works in C#, and it even creates a .lib & .exp file for your C# assembly to be consumed by C++:

internal class Sample
{
  [DllExport("_export_test", CallingConvention.Cdecl)]
  static int Test(int a)
  {
     return a + 1;
  }
}
查看更多
登录 后发表回答