3

我有一个小的 C# 类 (Gram.cs),它正在使用第 3 方 dll 来操作设备。现在,我需要使用 C++ 调用这个 C# 类中的一些函数。

我该怎么做?

我正在使用 MS Visual Studio 2010 专业版。

4

3 回答 3

3

如果C#类很小,并且它处理 native dll,它可能会通过更简单地重写该类 in C++,而不是集成.Net到您的应用程序中。此外,集成.Net将强制.Net启动整个虚拟机来处理您的简单类。

否则,

  • 您可以使用COM 互操作:基于您的C#类构建程序集并使其 COM 可见。然后您可以将类用作 COM 对象。
  • 您可以使用托管 C++在托管代码和非托管代码之间进行包装。
  • 您可以反转控制流,因此C#代码将调用非托管函数。在这种情况下,您可以从二进制文件中导出它并从C#带有DllImport属性的代码中导入。
于 2013-05-10T19:32:31.977 回答
2

通常,您应该将您的 c# 代码作为 COM 从您的 c# 项目设置中可见,并使用 c# IJW regasm 工具。

查看http://msdn.microsoft.com/en-IN/library/ms173185.aspx

几年前,我使用这种方法将 c# 集成到 c++ 中。

您将能够在您的 c++ 代码中将您的 c# 程序集作为 COM 组件加载。

于 2013-05-10T19:25:55.753 回答
1

这可能是您正在寻找的(我之前在这里回答过类似的问题:how to : use c++ projects for windows phone (C#)

a) 直接从 C 库加载符号,例如:

using System;
using System.Runtime.InteropServices;
static class win32
{
    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport("kernel32.dll")]
    public static extern bool FreeLibrary(IntPtr hModule);   
}

(这取自:http : //www.andyrushton.co.uk/csharp-dynamic-loading-of-ac-dll-at-run-time/ 经过简短的谷歌搜索)

为此,您需要将 C++ 接口方法导出为“C”,例如:

extern "C" __declspec( dllexport ) int MyFunc(long parm1);

(来自 MSDN:http: //msdn.microsoft.com/en-us/library/wf2w9f6x.aspx

b) 在 C++/CLI 中使用包装器将非托管 C++ 连接到托管 C#:

这是一个很好的例子: http: //www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-10-minutes

请注意,乍一看语法有些奇怪,并且不能使用任何东西。但是,您获得的是使用 C++ 类的能力——导出“C”会禁止您这样做。

于 2013-12-16T22:28:09.067 回答