C# 创建可由本机和托管应用程序使用的DLL
即使搜索了一会儿,我也找不到一个明确的答案。这似乎是一个不常见的问题: 我有一个本机实现,应该放在DLL中。该DLL应可供本机应用程序和托管应用程序使用 因此,如果我用C++/CLI编写此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的编译方式与常规本机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。