Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建可由本机和托管应用程序使用的DLL_C#_C++_C++ Cli_Native_Managed - Fatal编程技术网

C# 创建可由本机和托管应用程序使用的DLL

C# 创建可由本机和托管应用程序使用的DLL,c#,c++,c++-cli,native,managed,C#,C++,C++ Cli,Native,Managed,即使搜索了一会儿,我也找不到一个明确的答案。这似乎是一个不常见的问题: 我有一个本机实现,应该放在DLL中。该DLL应可供本机应用程序和托管应用程序使用 因此,如果我用C++/CLI编写此DLL,我可以公开两件事: 本机应用程序可以使用的平坦的C风格导出函数接口 可通过引用此DLL从任何托管应用程序(例如C#)使用的托管类 这样行吗?纯本机应用程序是否能够加载此DLL并调用公开的函数?本机DLL的编译方式与常规本机DLL(no/clr)类似。 调用C++/CLI应用程序/DLL使用C++类通过L

即使搜索了一会儿,我也找不到一个明确的答案。这似乎是一个不常见的问题:

我有一个本机实现,应该放在DLL中。该DLL应可供本机应用程序和托管应用程序使用

因此,如果我用C++/CLI编写此DLL,我可以公开两件事:

  • 本机应用程序可以使用的平坦的C风格导出函数接口
  • 可通过引用此DLL从任何托管应用程序(例如C#)使用的托管类

  • 这样行吗?纯本机应用程序是否能够加载此DLL并调用公开的函数?

    本机DLL的编译方式与常规本机DLL(no/clr)类似。 调用C++/CLI应用程序/DLL使用C++类通过LoadLibrary和GETPrAuDress加载DLL。 您需要拥有上面的C++类映射DLL本地的所有函数。 C++类充当代理类:

    例如:

    本机DLL有一个函数
    foo()

    C++/CLI代码公开了一个如下所示的方法foo:

    void MyProxy::foo() {
        m_foo(); // m_foo is a function pointer to foo() in the DLL obtained via GetProcAddress.
    }
    

    是的,这是C++/CLI存在的原因之一——它一点也不“罕见”,我们一直都在这样做。COM组件可以从本机代码和托管代码调用;这是另一种选择。事实证明,这似乎不起作用。我必须用/MT开关编译我的DLL(可能是因为我链接的某个库?)。但是我不能用/clr编译(/MT和/clr不能一起工作,链接器说)。。。啊!使用简单的分层技术。首先编写本机代码,以便可以从非托管代码直接使用。在其上添加一个C++/CLI层,该层使用本机代码,因此可以从托管代码中使用。使用来自本机代码的纯托管代码是可能的,只是要正确使用要困难得多。你必须了解COM。