标签: delay-load

将自定义路径设置为引用的DLL?

我有一个C#项目(调用它MainProj)引用了其他几个DLL项目.通过将这些项目添加到MainProj引用中,它将构建它们并将其生成的DLL复制到MainProj的工作目录中.

我想做的是将这些引用的DLL放在MainProj工作目录的子目录中,即MainProj/bin/DLLs,而不是工作目录本身.

我不是一个非常有经验的C#程序员,但是来自C++世界,我假设一种方法是删除项目引用并通过路径和文件名显式加载所需的DLL(即在C++中LoadLibrary).然而,我更喜欢做的,如果有办法的话,就是设置某种"引用二进制路径",所以当我构建时它们都被自动复制到这个子目录中(然后从那里引用它们)我需要明确加载每个).这样的事情可能吗?

如果不是,那么C#中首选的方法是什么来实现我所追求的目标(即Assembly.Load/ Assembly.LoadFile/ Assembly.LoadFrom?某些东西AppDomain,或者System.Environment?)

c# dll reference delay-load

49
推荐指数
3
解决办法
8万
查看次数

在NUnit中延迟加载TestCaseSource

我有一些使用TestCaseSource函数的NUnit测试.不幸的是,我需要的TestCaseSource函数需要很长时间才能初始化,因为它以递归方式扫描文件夹树以查找将传递给测试函数的所有测试图像.(或者,它可以在每次运行时从文件列表XML加载,但仍然需要自动发现新的图像文件.)

是否可以与TestCaseSource一起指定NUnit属性,以便NUnit在用户单击节点或运行测试套件之前不会枚举测试用例(不调用TestCaseSource函数)?

将所有测试图像存储在文件夹中的需求是项目要求,因为其他无权访问测试项目的人需要将新的测试图像添加到文件夹,而无需修改测试项目的源代码.然后他们就可以查看测试结果.

一些教条式的单位测试者可能会反驳说我正在使用NUnit来做一些它不应该做的事情.我不得不承认我必须满足一个要求,NUnit是一个很棒的工具,有一个很好的GUI,可以满足我的大多数要求,所以我不关心它是否是正确的单元测试.

其他信息(来自NUnit文档)

关于对象构造的注释

NUnit在加载测试时定位测试用例,使用非静态源创建每个类的实例,并构建要执行的测试列表.每个源对象此时仅创建一次,并在加载所有测试后销毁.

如果数据源位于测试夹具本身中,则使用TestFixtureAttribute上提供的fixture参数的相应构造函数或默认构造函数(如果未指定参数)创建对象.由于此对象在运行测试之前被销毁,因此除了通过参数本身之外,这两个阶段之间或不同运行之间无法进行通信.

似乎预先加载测试用例的目的是避免在TestCaseSource和测试执行之间进行通信(或副作用).这是真的?这是要求预先加载测试用例的唯一原因吗?

注意:

需要修改NUnit,如http://blog.sponholtz.com/2012/02/late-binded-parameterized-tests-in.html中所述.

有计划将此选项引入更高版本的NUnit.

nunit delay-load testcasesource

5
推荐指数
1
解决办法
1073
查看次数

当应用程序多次启动时,延迟加载 DLL:“异常 0xC06D007E:找不到模块”

我的应用程序在使用延迟加载 DLL 时遇到过间歇性崩溃的情况。我们在几个不同的调用堆栈中都看到了崩溃,但0xC06D007E: Module not found__delayLoadHelper2.

连续多次(连续)调用该进程时会引发异常。这是一个示例调用堆栈:

KERNELBASE.dll!RaiseException()  + 0x3d bytes   
MYDLL.dll!__delayLoadHelper2(const ImgDelayDescr * pidd=0x000000000012f650, __int64 (void)* * ppfnIATEntry=0x000000000012f570)  Line 331    C++
MYDLL.dll!__tailMerge_MyDelayLoadDLL_dll()  + 0x3f bytes    Unknown
MYDLL.dll!MyUserFunction()  Line 91 + 0x5 bytes C++
Run Code Online (Sandbox Code Playgroud)

C++ 应用程序使用 Delay Load DLL 来加载 .NET 代码。

发生崩溃的计算机是非常强大的机器(12核CPU,48G RAM),我不确定它是否对其有影响。但由于崩溃并不总是发生,因此它看起来像是竞争条件或资源问题。

这个论坛帖子描述了我的情况,但没有解决方案。

知道为什么会发生这种情况吗?

c++ windows dll exception delay-load

5
推荐指数
1
解决办法
1万
查看次数

延迟加载 DLL 和关联的 .lib 文件

我试图在我的应用程序中延迟加载 wintrust.dll 和 crypt32.dll (这些用于在 DLL 中执行数字签名/发布者检查)。我用的是VS2008。将这两个 DLL 添加为项目属性链接器部分的延迟加载属性中的条目后,我仍然收到 LNK4199 警告,表示未从 DLL 中加载任何内容,并且 LNK2019 错误无法解析 WinVerifyTrust 等符号。

将以下内容添加为“附加依赖项”可以缓解此问题:crypt32.lib 和 wintrust.lib。我现在没有遇到链接问题。但是,我想知道如何确保它没有链接到静态库?由于潜在的许可问题,我不想链接到静态库。我想动态加载 Windows 中安装的 DLL,并希望 DelayLoad 可以帮助我做到这一点,而不必求助于 LoadLibrary 和 GetProcAddress 函数调用。

任何有关所有不同库使用/链接选项的信息将不胜感激!

谢谢。

c++ dll linker static-libraries delay-load

4
推荐指数
1
解决办法
2830
查看次数

在C++中禁用自动DLL加载

我的场景如下:我的应用程序依赖于某个DLL(我在链接时使用它的lib).但是,当我的应用程序执行时,我想使用LoadLibrary显式加载该DLL.但是,默认情况下,当代码到达需要该DLL的范围时,环境会自动查找,然后加载它.我想要禁用此行为,并且对于我所关心的所有内容,如果应用程序达到了它想要执行属于该DLL的代码的程度,我更喜欢它会崩溃而不是自动加载它(因此DLL将只加载因为我明确地调用了LoadLibrary).
同时,我正在使用延迟加载能力(因此只有在实际需要加载DLL时才会发生加载触发).但是,如果DLL尚未加载,我希望应用程序崩溃.

也许是否有人熟悉实现这一目标的方法?

c++ dll loadlibrary dynamic-loading delay-load

2
推荐指数
1
解决办法
2489
查看次数