C++ C++;控制台应用程序调用C++/CLI静态库

C++ C++;控制台应用程序调用C++/CLI静态库,c++,c++-cli,C++,C++ Cli,我正在考虑创建一个C++/CLI静态库的想法,该库为托管EventLogger功能公开了许多静态函数。我的当前解决方案是从 /CLR < /C>编译的C++项目和C++控制台应用程序. Visual Studio告诉我需要使用/clr参数编译ConsoleApp,但我不想这样做。有什么方法可以实现我在这里的目标吗 ####控制台app.cpp #包括 #包括“./clretwloger/clretwloger.h” int main() { clr_etw_记录器::etw_记录器::etw_日

我正在考虑创建一个C++/CLI静态库的想法,该库为托管EventLogger功能公开了许多静态函数。我的当前解决方案是从<代码> /CLR < /C>编译的C++项目和C++控制台应用程序.

Visual Studio告诉我需要使用
/clr
参数编译ConsoleApp,但我不想这样做。有什么方法可以实现我在这里的目标吗

####控制台app.cpp
#包括
#包括“./clretwloger/clretwloger.h”
int main()
{
clr_etw_记录器::etw_记录器::etw_日志();
}
####clretwloger.h(/clr),静态库
#布拉格语一次
#使用
使用名称空间系统;
使用名称空间诊断;
命名空间clr_etw_记录器
{
公共参考类etw\U记录器
{
公众:
静态无效etw_日志()
{
const auto source=gcnew字符串(“dotNet clretwloger”);
const auto log=gcnew字符串(“EtwLogger”);
const auto event=gcnew字符串(“示例事件1”);
如果(!EventLog::SourceExists(源))
{
EventLog::CreateEventSource(源,日志);
}
EventLog::WriteEntry(源,事件);
EventLog::WriteEntry(源,事件,EventLogEntryType::Warning,234);
}
};
}

不能创建静态C++/CLI库,它必须是DLL。从本机代码调用托管代码(也称为“反向pinvoke”)是非常危险的,C++/CLI被优化为执行相反的操作。这不是不可能的(在函数上使用u declspec(dllexport)),使其可靠是更大的问题。托管代码喜欢抛出异常,当这种情况发生时,您根本不知道本机代码中出现了什么错误。如果您编写此库只是为了获得ETW日志记录的好处,那么只需将其设置为本机。从我所看到的情况来看,这种库的本机实现比尝试通过C++/CLI实现要花费更多的精力。在我发布这篇文章之后,我意识到静态库在这里没有多大意义,所以我将其更改为动态库。我会按照你的建议去研究这个declspec。