繁体   English   中英

如何在应用程序清单中正确引用私有 Windows 程序集?

[英]How do I correctly reference a private Windows assembly in the Application Manifest?

我的设置和我试图实现的目标

我的项目设置为使用CMakeNinja作为我的生成器, MSVC作为我的编译器。 我有一个可执行目标A.exe和 2 个共享库目标( B.dllC.dll )。 我在 Windows 上并通过链接到他们的 static 对应B.libC.lib来使用加载时链接。 此目标的依赖关系如下: A.exe -> B.dll -> C.dll (将“->”读作“取决于”)。

一切都成功编译和构建,但是当我尝试运行程序时出现此错误:

The Application has failed to start because its side to side configuration is incorrect

我项目的基本文件夹结构:

\
 | - A.cpp
 | - B.cpp
 | - C.cpp
 | - A.manifest
 | - B.manifest
 | - C.manifest
 | - CMakeListst.txt

代码

CMakeLists.txt:

cmake_minimum_required(VERSION 3.22.0)
project(test VERSION 0.1.0)

add_executable(
    A
    "A.cpp"
    "A.manifest"
)


add_library(
    B
    SHARED
    "B.cpp"
    "B.manifest"
)

add_library(
    C
    SHARED
    "C.cpp"
    "C.manifest"
)

target_link_libraries(B C) # B -> C
target_link_libraries(A B) # A -> B

CPP 文件

A.cpp:

__declspec(dllimport) void B_test();

int main()
{
    B_test();
    return 0;
}

B.cpp:

__declspec(dllimport) void C_test();

__declspec(dllexport) void B_test()
{
    C_test();
}

C.cpp:

#include <iostream>

__declspec(dllexport) void C_test()
{
    std::cout << "Success" << std::endl;
}

清单

A.清单:

<?xml version="1.0" encoding="UTF-8"?>
<assembly
        xmlns="urn:schemas-microsoft-com:asm.v1"
        manifestVersion="1.0"
        >

    <assemblyIdentity
            type="win32"
            name="A"
            language="*"
            processorArchitecture="amd64"
            version="1.0.0.0"
            />
            
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                    type="win32"
                    name="B"
                    language="*"
                    processorArchitecture="amd64"
                    version="1.0.0.0"
                    />
        </dependentAssembly>
    </dependency>

</assembly>

B.清单:

<?xml version="1.0" encoding="UTF-8"?>
<assembly
        xmlns="urn:schemas-microsoft-com:asm.v1"
        manifestVersion="1.0"
        >

    <assemblyIdentity
            type="win32"
            name="B"
            language="*"
            processorArchitecture="amd64"
            version="1.0.0.0"
            />

    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                    type="win32"
                    name="C"
                    language="*"
                    processorArchitecture="amd64"
                    version="1.0.0.0"
                    />
        </dependentAssembly>
    </dependency>

    <file name="B.dll" />

</assembly>

C.清单:

<?xml version="1.0" encoding="UTF-8"?>
<assembly
        xmlns="urn:schemas-microsoft-com:asm.v1"
        manifestVersion="1.0"
        >
    <!-- details about our side-by-side assembly-->
    <assemblyIdentity
            type="win32"
            name="C"
            language="*"
            processorArchitecture="amd64"
            version="1.0.0.0"
            />

    <file name="C.dll" />
</assembly>

我试过的

  • 正如我从 Microsoft 文档中读到的那样, C.manifest实际上并不是必需的,所有.dll文件都应该在B.manifest中引用,但这也不起作用。
  • 我试图避免使用清单,但如果我这样做,我会得到同样的错误。

我想要的是让我的A.exe依赖于B.dll ,它也依赖于C.dll 我想知道我哪里错了,我该怎么做才能实现我的目标。

在其他程序员的帮助下,在评论中添加和删除.manifest文件中的一些行,我终于让它工作了。 感谢西蒙穆里埃

A 应该声明 B 和 C dll – Simon Mourier

我的错误是将我的B.dllC.dll声明为单独的私有程序集。 事实上,我必须做的是将<file>标签添加到A.manifest中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<assembly
        xmlns="urn:schemas-microsoft-com:asm.v1"
        manifestVersion="1.0"
        >

    <assemblyIdentity
            type="win32"
            name="A"
            language="cpp"
            processorArchitecture="amd64"
            version="1.0.0.0"
            />
    <!-- Added the .dll's to application manifest -->
    <file name="B.dll" />
    <file name="C.dll" />

</assembly>

此外,不再需要B.manifestC.manifest ,我将它们排除在构建之外:

cmake_minimum_required(VERSION 3.22.0)
project(test VERSION 0.1.0)

add_executable(
    A
    "A.cpp"
    "A.manifest"
)

# removed "B.manifest"
add_library(
    B
    SHARED
    "B.cpp"
)

# removed "C.manifest"
add_library(
    C
    SHARED
    "C.cpp"
)

target_link_libraries(B C) # B -> C
target_link_libraries(A B) # A -> B

有了它,一切正常并且输出正确

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM