在我的团队中,我们有数百个共享的dll,其中许多还引用了其他dll本身引用其他dll,依此类推.我们已经开始为所有我们认为足够通用的dll使用'Shared'目录,以便在其他项目中使用,例如数据库comms dll.
问题是,如果更改了树中的一个dll,那么引用它的所有内容都需要重新编译,以避免版本问题(在运行时发生).
为了避免这种情况,现在有人谈论将我们所有的"共享"dll添加到一个大型程序集中,任何创建新应用程序的人都只是引用它,仅此而已.
这显然会变得越来越大,我不确定这是不是最好的方式.有什么想法吗?
我有一个ac#类库项目,它使用在系统上注册的COM dll.我现在想要将COM dll部署为并排程序集,因此我不必注册它,也不必干扰可能使用不同版本的dll的其他应用程序.
我已经使用add new item菜单将app.manifest添加到c#项目中,但我不确定下一步该做什么.在项目属性/应用程序/图标和清单中,清除了清单下拉列表.我不知道怎么过去.我添加了一个清单文件,为什么它不在下拉列表中?
我有一个适用于C++应用程序的COM DLL的清单,我想我保持原样.现在我需要知道如何为c#项目编辑app.manifest.我将首先添加一个已知良好的依赖元素.但我需要一个关于如何设置它的教程,我不认为它覆盖在任何地方.
我正在使用VS2008
我有一个Visual Studio 2008 .NET C++/CLI解决方案.我的解决方案包含许多子项目.我为每个项目定义了一个自定义的buid目录,称之为Output.
MySoultion
每个子项目都使用Log4.net.所以我创建了一个目录(称为LogBinary)并将log4.net dll放在该文件夹中.然后使用log4net我添加这个dll作为我的每个项目的引用...但是当我尝试编译我的主项目(*.exe)我收到了大量警告(超过400 ...)
举个例子:
警告110警告C4945:'AbsoluteTimeDateFormatter': 无法从 'somepath\log4net.dll' 导入符号:因为'log4net :: DateFormatter :: AbsoluteTimeDateFormatter' 已经从另一个程序集 'log4net'"somepath\log4net.dll" 导入
很多警告
已经从另一个程序集导入
为什么我收到这个警告?是否有人为多个项目添加相同的dll(使用GAC除外)
最好的祝愿
不知怎的,我很幸运,从来没有处理过这个问题,尽管我认为这是一个常见的问题:
我有一个网络项目,让我们称之为SomeProject
.SomeProject
有一个第三方库的参考,我们称之为SomeThirdParty
版本1.0.SomeProject
还有一个本土类库的参考,我们称之为SomeLibrary
.SomeLibrary
也有一个参考SomeThirdParty
,但不同的版本(让我们说2.0).
版本1.0和2.0 SomeThirdParty
共享大多数相同的签名,但是是不同的实现.我需要SomeProject
使用1.0实现,并SomeLibrary
尽可能使用2.0实现.
我SomeProject
使用它对log4net的引用进行编译.最终在bin目录中的DLL是SomeProject
引用的DLL .在运行时,当运行代码时SomeLibrary
,它会尝试从2.0版本执行代码SomeThirdParty
,当然FileLoadException: Could not load file or assembly '
也会失败,抛出SomeThirdParty, Version=2.0.0.0, Culture=[etc.]' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.
显然我可以升级SomeProject
到较新的DLL或降级SomeLibrary
到较旧的DLL,但由于许多原因它不是理想的.
我认为正确的答案涉及在GAC中安装SomeThirdParty,但我不确定我将如何做到这一点,以及它将如何影响其他开发人员和服务器.
您可能有任何建议表示赞赏.
谢谢您的帮助.
我需要动态链接我创建的库.我不确定问题是什么.这一切编译正确,但我总是赶上handle
为NULL
指针:
void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
error = dlerror();
printf("%s\n", error);
printf("Error loading library.\n");
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
我无法通过这个错误,我不确定什么可能是错的.我很确定我已经正确编译了所有内容.以下是我使用的编译步骤:
gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4
Run Code Online (Sandbox Code Playgroud)
我收到的错误是读取的
只能加载ET_DYN和ET_EXEC.
我得到了我正在尝试编译的.NET项目的源代码.虽然,该项目使用Office 2010中的参考(命名空间)Microsoft.Office.Interop.Word,我无法在任何地方找到.我能够下载该文件,microsoft.office.interop.word.dll
但显然是Office 2007中的文件,因为它仍然无法编译,因为项目使用该功能Document.SaveAs2
(来自Office 2010库).我的计算机上安装了Office 2007,桌面上安装了Visual Studio 2012 Express.
你能解释一下这是怎么回事吗?我怎么能下载dll但我找不到Office 2010中的那个.为什么我的客户端能够在没有这个dll的情况下编译projet?如果在编译时安装,Visual Studio是否会自动"连接"到Microsoft Office库?
谢谢您的帮助.
假设EXE和DLL使用相同的编译器和STL版本.如果我在我的EXE中使用std :: vector并使用reserve来保留内存.然后我将它作为DLL的引用传递给它.
我在DLL中执行push_back以向我的向量添加元素.如果我没有超过实际容量,那么在DLL或EXE中分配的新元素的内存是多少?
我有一些用.Net
框架编写的 dll,4.0
当我将它引用到我用.NET core 2.0
.
尽管我的 IDE(与 2017 相比)可以在运行时正确识别从该 dll 导入的对象,但我有以下异常:
System.BadImageFormatException: 'Could not load file or assembly 'A_dotnet_4.0_A, Version=10.0.0.0, Culture=neutral, PublicKeyToken=0ad20d08c672086a'. An attempt was made to load a program with an incorrect format.'
Run Code Online (Sandbox Code Playgroud)
我试过了:
甚至有可能吗?如果是这样,我该怎么做。在以下链接中似乎有可能 - 我只是不明白如何。
正如标题所示,我在“调试”>“Windows”下看不到任何“模块”子菜单,并且快捷键 Ctrl+Alt+U 没有任何作用。
刚刚通过安装程序恢复了 Visual Studio,什么也没有。
我有 VS 2019 Community 版本 16.6.1,意大利语版本。
我错过了什么还是它是一个错误?怎么修?
众所周知,堆内存的释放必须使用与分配它的分配器相同的分配器来完成。在跨 DLL 边界交换堆分配的对象时需要考虑这一点。
一种解决方案是为每个对象提供一个析构函数,就像在 C API 中一样:如果 DLL 允许创建对象 A,则它必须提供一个函数A_free
或类似的东西1。
另一个相关的解决方案是将所有分配包装到其中,因为它们存储到释放器2shared_ptr
的链接。
另一种解决方案是将顶级分配器“注入”到所有加载的 DLL(递归地)3中。
另一种解决方案是不交换堆分配的对象,而是使用某种协议4。
另一种解决方案是绝对确保 DLL 将共享相同的堆,如果它们共享兼容的编译选项(编译器、标志、运行时等),则应该(将会?)发生这种情况5 6。这似乎很难保证,特别是如果人们想使用包管理器而不是立即构建所有内容。
有没有办法在运行时检查多个 DLL 之间的堆实际上是否相同,最好以跨平台的方式?
为了可靠性和易于调试,这似乎比希望应用程序立即崩溃而不是默默地破坏东西更好。