我遇到了一个非常奇怪的问题,试图在 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/