你知道,我在任何地方都没有看到一个好的答案.是否可以将预先存在的DLL嵌入到已编译的C#可执行文件中(这样您只能分发一个文件)?如果有可能的话,怎么去做呢?
通常情况下,我很酷,只是将DLL放在外面并让安装程序处理所有内容,但是有几个人在工作,他们问我这个,老实说我不知道.
在C++中创建类库时,可以在动态(.dll
,.so
)和静态(.lib
,.a
)库之间进行选择.它们之间有什么区别,何时适合使用哪种?
我的可执行文件有问题.我在我的Windows 7 64位开发盒上运行这个C++ 32位可执行文件,它还包含所有这些Microsoft应用程序(Visual Studio 2008 + 2010,TFS,SDK,Microsoft Office)......它仍然可以正常运行.
现在我得到了同一个程序的客户端安装,并被要求用干净的Windows 7安装进行测试.因此,我得到了一个Windows 7 64位VMware,并将其更新为Windows 7 SP 1(我的开发人员盒正在调整的版本相同).但是在我的开发人员盒上,一切都很好,该程序不适用于VMware(30天试用版)框.
x86 Dependency Walker告诉我缺少以下DLL文件:
我搜索了那些API-MS-WIN -... DLL文件,发现它们实际上应该已经成为Windows 7的一部分(一些网站声称属于Windows 8和Windows Server 2012).
我已经尝试过我发现的建议修复程序,它们是:
但这并没有解决任何问题.:-(
旁注:我的开发盒也没有它们,似乎不需要它们.例如,我的盒子上的user32.dll没有链接其中一个,而VMware上的安装确实如此.
有关如何解决此问题的任何想法?我试图在Microsoft页面上找到合适的下载/修复程序,但是我失败了.
在解决了我的问题后,我想报告我发现的内容,我不能将此作为答案发布,因为问题已经结束.
实际上Dependency Walker工具报告的所有DLL文件都丢失了,即那些
* API-MS-WIN-CORE-...
Run Code Online (Sandbox Code Playgroud)
类型DLL文件不是实际问题的一部分.
在我的情况下,三个OCX文件的注册丢失,之后一切都很好,但依赖Walker工具仍然列出了所有相同的DLL文件,即使程序刚刚运行正常.
它的要点:正如其他人所说,该工具现在有点过时,并不总是适用于较新的操作系统.因此,请密切关注并且不要因错过'API-MS-WIN-CORE-COM-L1-1-0.DLL'而误导......,问题可能完全在其他地方.
我想编写一个测试脚本或程序,断言给定目录中的所有DLL文件都是特定的构建类型.
我会在SDK的构建过程结束时使用它作为一个健全性检查,以确保64位版本没有以某种方式获得一些32位DLL文件,反之亦然.
有没有一种简单的方法来查看DLL文件并确定其类型?
该解决方案应该适用于xp32和xp64.
我参与了关于Linux中的库的一些争论,并想确认一些事情.
这是我的理解(请纠正我,如果我错了,我将在稍后编辑我的帖子),在构建应用程序时有两种使用库的方法:
静态库的明显优势是他们让整个应用程序是自包含的,而动态库的好处是"所以"文件可以被替换(即:如果它需要更新由于安全bug),无需重新编译基本应用程序.
我听说有些人区分共享对象和动态链接库(DLL),即使它们都是".so"文件.在Linux或任何其他POSIX兼容操作系统(即:MINIX,UNIX,QNX等)上进行C/C++开发时,共享对象和DLL之间是否有任何区别?我被告知一个关键的区别(到目前为止)是共享对象只是在运行时使用,而DLL必须首先使用应用程序中的dlopen()调用打开.
最后,我还听到一些开发人员提到"共享存档",根据我的理解,这些存档也是静态库本身,但直接由应用程序使用.相反,其他静态库将链接到"共享存档",以将一些(但不是全部)功能/资源从共享存档中提取到正在构建的静态库中.
提前谢谢大家的帮助.
在向我提供这些术语的上下文中,Windows开发人员必须学习Linux的实际上是错误的术语.我试图纠正它们,但是(不正确的)语言规范被卡住了.
LDOPTS+=-lmylib
对于名为的库文件mylib.so
).库必须在编译时出现,并在应用程序启动时出现.LDOPTS+=-lmylib
对于名为mylib.a的库文件).库必须在编译时出现.dlopen()
/ dlsym()
命令,以便库不需要存在在构建时对程序进行编译.此外,库不需要在应用程序启动或编译时存在(必要),因为只有在调用dlopen
/ dlsym
调用时才需要它.LDOPTS+=-lmylibS
用于名为mylib mylibS.a
.a 的库文件).两者之间的区别在于,如果共享对象或DLL想要将共享存档静态链接到其自己的代码并且能够使共享对象中的函数可用于其他程序而不是仅使用它们,则需要此附加标志. DLL的内部.当有人为您提供静态库,并且您希望将其重新打包为SO时,这非常有用.库必须在编译时出现." DLL
"和" shared library
" 之间的区别只是我当时工作的公司(懒惰,不准确)的口语主义(Windows开发人员被迫转向Linux开发,术语卡住),坚持上述说明.
另外,在S
"共享档案"的情况下,库名后面的尾随" "字面只是该公司使用的惯例,而不是一般的行业.
什么曾经在我的asp.net webforms应用程序中工作现在抛出此错误:
System.MissingMethodException:找不到方法
该DoThis
方法在同一个类上,它应该工作.
我有一个通用的处理程序:
public class MyHandler: IHttpHandler
{
public void Processrequest(HttpContext context)
{
// throws error now System.MissingMethodException: Method not found?
this.DoThis();
}
public void DoThis()
{
//
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道我们什么时候需要放置一个文件
在64位Windows系统上的C:\ Windows\System32或C:\ Windows\SysWOW64.
我有两个DLL,一个用于32位,一个用于64位.
逻辑上,我以为我将32位DLL放在C:\ Windows\System32下,将64位DLL放在C:\ Windows\SysWOW64下.
令我惊讶的是,这是相反的方式!的32位一个进入C:\的Windows\SYSWOW 64,和64位DLL进入C:\的Windows \系统32.
很混乱的东西.这背后的原因是什么?
DLL文件究竟是如何工作的?似乎有很多它们,但我不知道它们是什么或它们是如何工作的.
那么,与他们的交易是什么?
这个警告:
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
with use of other libs; use /NODEFAULTLIB:library
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中是一个相当常见的警告.我想了解它的确切原因以及正确的方法(如果有的话)来处理它.
这出现在一个编译的调试版本中/MDd
.该项目与windows之类的东西相关联,Version.dll
并pdh.dll
与之相关MSVCRT.dll
.显然,我没有这些的调试版本,无法编译它们.
所以我添加/NODEFAULTLIB:MSVCRT
到链接器命令行,它实际上删除了警告.但这实际上做了什么?为什么有必要?
每当我尝试将4个文件复制到我的bin文件夹中时,在停止主服务后,我收到一个文件错误(TexteDll).错误是:
Cannot copy TexteDll: The requested operation cannot be performed on a file
with a user-mapped section open
Run Code Online (Sandbox Code Playgroud)
这可能是由于某些系统锁定.或者也许另一个进程正在使用此DLL.当我用Google搜索时,我发现重新启动系统可能会解决此问题.
有人可以为此提出原因或解决方案吗?我检查了TexteDll的属性(通用,版本,安全性等).一切看起来都很正常.