当在c#中加载c++ dll时,CLR是否会自动加载c++文件的依赖项?
When loading a C++ dll in C#, does the CLR load the dependencies of the C++ file automatically?
这就是我的问题,我计划实现一个c++ dll,它有许多c++依赖关系,我想在我的c#代码中使用它..我想知道的是CLR是否自己加载依赖关系,或者我必须做其他事情。当在c#中加载c++ dll时,CLR会自动加载c++文件的依赖项吗?
如果是本地c++ dll,则依赖项在加载时加载,除非该依赖项被标记为延迟加载,否则当调用该dll中的某个函数时,它将被加载。
如果是。net c++ dll,则在需要时加载依赖项。
从技术上讲,答案是否定的。CLR不加载本机DLL的依赖项——但这纯粹是技术问题——它们将自动加载(如果可能且可用)。
实际发生的事情有点复杂。CLR根本不(自己)加载dll——dll是由本机Windows加载器加载的。在. net程序集的情况下,CLR代码基本上存储为二进制资源。您还有一个调用CLR本地入口点的dlmain。当从DllMain调用CLR时,它会初始化程序集。
正常的Windows加载程序也会(当然)加载本地dll。在这种情况下,加载器(在没有delayload标志的情况下)将遍历dll依赖项并加载它们。即使初始DLL的加载是从CLR触发的,在DLL及其所有隐式依赖项加载完成之前,CLR也不会进一步参与。只有之后的所有dll(也可能包括字体、可执行文件等)被"加载"才会控制返回到CLR。
注意我把"loaded"放在引号里是有原因的——DLL通常也不会被加载到内存中——加载器只会建立页表来将它映射到内存中,然后这些页将按需加载(尽管有些页,比如那些持有的 DLL的DllMain将或多或少立即加载,当它的DllMain被调用时)。
所以假设你有一个。net程序集,它使用带有本机依赖项的本机DLL,顺序将是:
- 负载装配
- 程序集的dlmain调用CLR
- CLR加载本地DLL
- Loader加载本地DLL的所有依赖项 只有在所有隐式依赖项加载完成后,控制才返回到CLR。
可以,但前提是它们在搜索路径中可用(即应用程序路径,windows系统路径等)
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- 是否有原子加载非原子值的函数?
- 将 bmp 文件加载到 TSpeedButton 中
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常