c++ - 如果删除未使用的引用类,则 DLL 无法加载

标签 c++ visual-studio visual-c++ uwp windows-runtime

我遇到了一个非常奇怪的问题,试图在 UWP 应用程序(VS2017 社区 15.9.13 和 NetCore.UniversalWindowsPlatform 6.2.8,编译时没有/clr 但有/ZW)中编译和使用 Windows 运行时组件。

它基本上类似于 Grayscaletransform .运行时组件实际上按预期工作,现在我想删除一些未使用的代码。但是,一旦我将它从特定文件中删除并重新编译,它确实可以编译、链接,但 DLL 不再加载。

这是我必须放入的一些示例代码:

ref class DummyU sealed
{
public:
    DummyU() {}
};

DummyU^ CreateDummyU()
{
    return ref new DummyU();
}

代码只是让它工作,尽管它 a) 根本没有被引用 b) 没有做任何有用的事情。

删除后的结果:

Exception thrown at 0x0EFF322F (vccorlib140d_app.dll) in TestAppUWP.exe: 0xC0000005: Access violation reading location 0x00000000.

STDAPI DllGetActivationFactory(_In_ HSTRING activatibleClassId, _Deref_out_ IActivationFactory** ppFactory)
{
    return Platform::Details::GetActivationFactory(Microsoft::WRL::Details::ModuleBase::module_, activatibleClassId, ppFactory);
}

dllexports.cpp 中的函数,它是 VS 的一部分。 module_ 变为 NULL

如果文件中没有显式实例化 ref 类,是否有人知道是否存在与 Windows 运行时未正确初始化/使用有关的任何已知错误?

编辑 1:

这是 link完整的源代码:

最佳答案

这里发生的是你有点混合模式。由于您已使用/CX 标志编译 C++ 代码,因此您已告知编译器启用 winrt 扩展以生成 WinRT DLL。但在实践中,您的代码实际上都没有使用 CX 扩展来实现类。您正在使用 WRL 和标准 C++。编译器查看 DLL,找不到 CX 样式的 WinRT 类,因此不会相应地设置模块。

这基本上是一个未经测试和不受支持的案例,因为您选择说要通过选择 UWP 组件库项目类型来公开 ref 类,但实际上并没有提供任何 ref 类。碰巧在引擎盖下,/CX 有效地使用了 WRL,因此您可以插入它并初始化状态以使其正常工作,但您有点破解了系统的实现细节。

我会推荐两个选项,两者都有效:只需将项目设为非 CX Win32 DLL 并如上所述初始化模块。或者,更好的是,翻到 C++ /WinRT ,这将为您提供比/CX 更好的 WinRT 类型支持,并允许您在实现中更轻松地混合经典 COM 类型。您只需关闭编译器开关中的/CX 标志即可开始,然后开始相应地更新代码。

关于c++ - 如果删除未使用的引用类,则 DLL 无法加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56842562/

相关文章:

visual-studio - Visual Studio 2015 : Lines in text editor

c# - 如何在托管 C++ 中正确实现带有事件的 C# 接口(interface)

c++ - 在基类中调用 shared_from_this() 时的 bad_weak_ptr

c++ - 类函数的多定义错误

visual-studio - 带有 Visual Studio 11 Beta .Net 4.5 的 Edmx 文件

c++ - 在 Visual C++ 中,出现警告但程序没有继续运行,有什么办法可以忽略它吗?

c++ - 如何在 VC++ 2010 中将 stdext::hash_set 用于自定义类型?

c++ - 是否可以获得 'this'指针的地址?

c++ - 如何在Eigen中使用Matrix类型参数声明函数?

asp.net - 如何将default.aspx设置为Visual Studio调试器的默认启动点?