我意识到这里有一个相关的线程: 加载程序集及其依赖项
但我正在修改一些东西,这并不完全适用.
string path = Path.GetDirectoryName( pathOfAssembly );
Environment.CurrentDirectory = path;
Assembly.Load(Path.GetFileNameWithoutExtension(pastOfAssembly));
Run Code Online (Sandbox Code Playgroud)
你真的有理由这样做吗?使用它不会更有意义吗:
Assembly.LoadFile(pathOfAssembly);
Run Code Online (Sandbox Code Playgroud)
任何见解将不胜感激.
假设我在Windows下运行的.NET用户应用程序(.exe)是在.NET Framework 3.0版(VS2008)中编译的.如果该应用程序加载使用.NET Framework 2.0版(VS2005)在另一台计算机上编译的另一个.NET程序集(.dll),那么加载的程序集是否会使用现有的3.0运行时(它将以向后兼容模式运行)?或者.NET Framework 2.0运行时是否会加载到系统的进程空间中,我们现在有两个并行运行的.NET运行时?
断言:这不是使用VS2008多目标.
场景:我们有一个服务器,其上托管有多个ASP.NET网站.几天前,这些网站中有相当一部分"破产",出现以下错误:
警告44无法解析此参考.无法找到程序集"AjaxControlToolkit,Version = 1.0.10920.32880,Culture = neutral,PublicKeyToken = 28f01b0e84b6d53e,processorArchitecture = MSIL".检查以确保磁盘上存在程序集.如果您的代码需要此引用,则可能会出现编译错误.
经过一些调查后,似乎已在服务器上安装了(商业)CMS系统,并且已将第三方AjaxControlTookit添加到全局程序集缓存中.它没有问,它只是添加了它(事实上,它添加了两个版本:1.0.10618.0和3.0.20229.0).这导致解决冲突,因为有问题的网站在其本地/ Bin目录中引用了不同版本的Toolkit.
所以,我想我的问题是:你认为这个CMS在GAC中安装这些程序集是否可以接受(特别是考虑到程序集是开源库而不是它们自己的)?或者是因为他们如何在/ Bin文件夹中引用程序集更明确地"破坏"错误的网站?谢谢.
我最近注意到,当我开始我们相当大的应用程序时,总是有两个程序集加载,没人知道它们是什么.每次我开始对应用程序进行调试时,两个程序集都会以不同的名称命名.
例如,上次我得到这个输出(它是德语,但你会得到它):
...
"start.vshost.exe" (Verwaltet): "C:\Windows\assembly\GAC_MSIL\System.Web.Services\2.0.0.0__b03f5f7f11d50a3a\System.Web.Services.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"start.vshost.exe" (Verwaltet): "aslf4pbc" wurde geladen
...
"start.vshost.exe" (Verwaltet): "inyuae-m" wurde geladen
"start.vshost.exe" (Verwaltet): "C:\Windows\assembly\GAC_MSIL\Microsoft.JScript\8.0.0.0__b03f5f7f11d50a3a\Microsoft.JScript.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"start.vshost.exe" (Verwaltet): "C:\Windows\assembly\GAC_MSIL\Microsoft.Vsa\8.0.0.0__b03f5f7f11d50a3a\Microsoft.Vsa.dll" wurde geladen
...
Run Code Online (Sandbox Code Playgroud)
aslf4pbc?inyuae米?
我查看了Assembly.CurrentDomain.GetAssemblies()以获取更多信息.
这里有两个组件的一些信息:
CodeBase/EscapedCodeBase:
"file:///C:/Windows/assembly/GAC_MSIL/system/2.0.0.0__b77a5c561934e089/System.dll"
Run Code Online (Sandbox Code Playgroud)
地点:
""
Run Code Online (Sandbox Code Playgroud)
GlobalAssemblyCache
false
Run Code Online (Sandbox Code Playgroud)
ManifestModule
inyuae-m.dll respectively aslf4pbc.dll
Run Code Online (Sandbox Code Playgroud)
ManifestModule.FullyQualifiedName …
我正在开发一个并行构建工具,它可以构建各种类型的windows程序(在很多其他东西中).我们的工具的一部分让我们的用户更轻松的生活是EXE和DLL文件的自动依赖性扫描.这意味着,如果用户说他们想要运行"bob.exe",那么当"bob.exe"被分发到构建网络中的其他节点时,他们不必担心依赖性问题.这是因为我们扫描"bob.exe"找出它需要的DLL并随之发送它们.
总的来说这很有效,除非EXE以编程方式加载DLL.然后必须将依赖项硬编码到用户make文件中.我们最近开始遇到的一个问题是如何处理C#DLL/EXE.这些似乎包含DLL引用,它们不是PE格式的一部分.我假设引用在某种C#容器中,并且C#运行时只是在C#运行时启动时以编程方式加载它们.
谁能告诉我在二进制级别扫描这些引用的最佳方法是什么?我的构建工具是多平台的,因此我的PE扫描程序用Java编写.因此,我不能依赖任何.NET库.我的PE扫描程序已经可以解析PE文件中的所有部分,并且我习惯于解析包含C++应用程序的并排程序集信息的部分.我只需要一些关于在C#应用程序中做什么的指示......
我有一个包含3个项目的解决方案.一个项目处理异步通信.当它完成它的回调时,它会引发一个事件SomethingCompleted.如何在同一解决方案中从另一个项目订阅此事件?
我在接收项目中构建了事件处理程序,但它没有在发送项目中看到事件.
我们的应用程序中有一个项目,它构建在32位或64位版本的dll中,具体取决于它所基于的机器上的处理器体系结构,以便于测试.
我可以预测将在给定机器上使用的dll,但是我们有几个开发人员,一些使用64位机器,一些使用32位机器,我希望能够检查他们放到实时服务器的构建是否已经上升使用32位版本的dll或64位版本的dll.
检查dll的属性不会提供此类信息.有没有办法得到它?
谢谢
当我在构建服务器上构建解决方案时,它会生成一个二进制文件夹,然后将这些二进制文件复制到最终的输出文件夹.在我的情况下,一些第三方程序集REFERENCES被正确复制,而其他第三方程序集REFERENCES没有被复制.请注意,我的解决方案项目不会直接引用要复制的程序集.
这意味着一切都很好.但是当我运行我的程序时它没有启动,因为它引用的程序集不能反过来加载它们的引用.
构建中的哪个进程确定将哪些程序集复制到二进制文件夹?有没有办法指定它应该复制所有程序集?
编辑:一种可能的解决方案是仅引用解决方案中某个项目中的所有必需程序集,但这会非常混乱.
我正在编写一个测试应用程序来执行一些回归测试.我们的想法是能够在库的多个版本上运行测试.我的目标是在字典中加载dll,其中键是版本字符串(例如"3.0.0.0"),值是Assembly实例.我能够动态加载一个程序集并在其上调用一个方法,但是当我尝试加载第二个程序集时,我得到以下异常:
The located assembly's manifest definition does not match the assembly reference.
Run Code Online (Sandbox Code Playgroud)
我正在使用以下行加载程序集:
asm = Assembly.LoadFrom(lib, hash, System.Configuration.Assemblies.AssemblyHashAlgorithm.MD5);
Run Code Online (Sandbox Code Playgroud)
'lib'是dll的完整文件名和路径.'hash'是dll的md5总和.
我看起来即使我告诉Windows"使用这个dll",它看着名称并说"我已经有那个"并使用之前加载的那个,因为哈希不匹配,它就失败了.最初,正在加载的dll没有汇编版本集,所以我将它设置为4个不同的版本,但它仍然抛出相同的异常.
有什么办法解决这个问题?
佐敦
我正在研究的项目将为大量类生成代码 - 预计会有数百到数千个.在生成时不知道实际上将访问多少这些类.
生成的类可以(1)全部存在于单个程序集中(或者可能是少数几个程序集),这些程序集将在脚趾消耗进程启动时加载.
...或者(2)我可以为每个类生成一个程序集,就像Java将每个类编译为单个*.class二进制文件一样,然后提出一种按需加载程序集的机制.
问题是:哪种情况会产生更好的(记忆和时间)表现?
我的直觉是,对于情况(1),加载时间和使用的存储器与构成单个整体组件的类的数量成正比.OTOH,案例(2)带有其复杂性.
如果您知道有关加载程序集内部的任何资源,特别是调用的代码(如果有的话!?)和分配的内存(新加载的程序集的簿记),请分享它们.