标签: dll

在C#中处理共享dll的最佳方法是什么?

在我的团队中,我们有数百个共享的dll,其中许多还引用了其他dll本身引用其他dll,依此类推.我们已经开始为所有我们认为足够通用的dll使用'Shared'目录,以便在其他项目中使用,例如数据库comms dll.

问题是,如果更改了树中的一个dll,那么引用它的所有内容都需要重新编译,以避免版本问题(在运行时发生).

为了避免这种情况,现在有人谈论将我们所有的"共享"dll添加到一个大型程序集中,任何创建新应用程序的人都只是引用它,仅此而已.

这显然会变得越来越大,我不确定这是不是最好的方式.有什么想法吗?

c# dll visual-studio

10
推荐指数
1
解决办法
2073
查看次数

如何将清单添加到.NET DLL?

我有一个ac#类库项目,它使用在系统上注册的COM dll.我现在想要将COM dll部署为并排程序集,因此我不必注册它,也不必干扰可能使用不同版本的dll的其他应用程序.

我已经使用add new item菜单将app.manifest添加到c#项目中,但我不确定下一步该做什么.在项目属性/应用程序/图标和清单中,清除了清单下拉列表.我不知道怎么过去.我添加了一个清单文件,为什么它不在下拉列表中?

我有一个适用于C++应用程序的COM DLL的清单,我想我保持原样.现在我需要知道如何为c#项目编辑app.manifest.我将首先添加一个已知良好的依赖元素.但我需要一个关于如何设置它的教程,我不认为它覆盖在任何地方.

我正在使用VS2008

.net dll manifest side-by-side

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

在同一个解决方案中为同一个项目添加相同的"*.dll"引用

我有一个Visual Studio 2008 .NET C++/CLI解决方案.我的解决方案包含许多子项目.我为每个项目定义了一个自定义的buid目录,称之为Output.

MySoultion

  • MyFirstProject(*.exe)
  • MySecondPrject(*.dll)
  • ...
  • MyNthProject(*.dll)

每个子项目都使用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除外)

最好的祝愿

.net dll gac log4

10
推荐指数
2
解决办法
4126
查看次数

使用不同版本的引用DLL

不知怎的,我很幸运,从来没有处理过这个问题,尽管我认为这是一个常见的问题:

我有一个网络项目,让我们称之为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,但我不确定我将如何做到这一点,以及它将如何影响其他开发人员和服务器.

您可能有任何建议表示赞赏.

谢谢您的帮助.

.net c# dll reference

10
推荐指数
1
解决办法
8159
查看次数

正确使用libdl和动态链接库

我需要动态链接我创建的库.我不确定问题是什么.这一切编译正确,但我总是赶上handleNULL指针:

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.

c dll shared-libraries

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

我在哪里可以找到Microsoft.Office.Interop.Word.dll(2010)?

我得到了我正在尝试编译的.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库?

谢谢您的帮助.

.net c# dll interop ms-office

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

C++跨越边界使用std :: vector

假设EXE和DLL使用相同的编译器和STL版本.如果我在我的EXE中使用std :: vector并使用reserve来保留内存.然后我将它作为DLL的引用传递给它.

我在DLL中执行push_back以向我的向量添加元素.如果我没有超过实际容量,那么在DLL或EXE中分配的新元素的内存是多少?

c++ dll stl vector c++11

10
推荐指数
1
解决办法
726
查看次数

在 .NET core 2.0 中引用 .NET framework 4 dll

我有一些用.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)

我试过了:

  1. 正如我在此处的帖子中看到的那样,将我的设置更改为任何 CPU
  2. 试图清理重建我的项目。

甚至有可能吗?如果是这样,我该怎么做。在以下链接中似乎有可能 - 我只是不明白如何。

c# dll .net-core

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

为什么我的 Visual Studio Community 2019 在“调试”>“Windows”下没有“模块”选项以及如何修复它?

正如标题所示,我在“调试”>“Windows”下看不到任何“模块”子菜单,并且快捷键 Ctrl+Alt+U 没有任何作用。

我的菜单

刚刚通过安装程序恢复了 Visual Studio,什么也没有。

我有 VS 2019 Community 版本 16.6.1,意大利语版本。

我错过了什么还是它是一个错误?怎么修?

c# debugging dll visual-studio-2019

10
推荐指数
1
解决办法
7603
查看次数

C++ 测试两个 DLL 是否共享同一堆

众所周知,堆内存的释放必须使用与分配它的分配器相同的分配器来完成。在跨 DLL 边界交换堆分配的对象时需要考虑这一点。

一种解决方案是为每个对象提供一个析构函数,就像在 C API 中一样:如果 DLL 允许创建对象 A,则它必须提供一个函数A_free或类似的东西1

另一个相关的解决方案是将所有分配包装到其中,因为它们存储到释放器2shared_ptr的链接。

另一种解决方案是将顶级分配器“注入”到所有加载的 DLL(递归地)3中。

另一种解决方案是不交换堆分配的对象,而是使用某种协议4

另一种解决方案是绝对确保 DLL 将共享相同的堆,如果它们共享兼容的编译选项(编译器、标志、运行时等),则应该(将会?)发生这种情况5 6。这似乎很难保证,特别是如果人们想使用包管理器而不是立即构建所有内容。

有没有办法在运行时检查多个 DLL 之间的堆实际上是否相同,最好以跨平台的方式?

为了可靠性和易于调试,这似乎比希望应用程序立即崩溃而不是默默地破坏东西更好。

c++ dll memory-management heap-memory shared-libraries

10
推荐指数
1
解决办法
327
查看次数