所以情况如下:
我有一个名为Lib1.dll的程序集.出于某种原因(与问题无关)我不得不将程序集文件名重命名为Lib1New.dll,现在尝试使用Assembly.LoadFile加载重命名的程序集时,我注意到CLR也尝试加载Lib1.dll.
如果在搜索路径中找到Lib1.dll,它将被加载到地址空间中.无论是否找到Lib1.dll,该应用程序都能正常运行.(问题是如果发现Lib1.dll文件被锁定,其他进程无法删除).

我不明白为什么LoadFile搜索并加载Lib1.dll.LoadFile应该在指定位置加载程序集文件的内容,为什么它在搜索文件.
LoadFile的MSDN文档:
使用LoadFile方法加载和检查具有相同标识但位于不同路径的程序集.LoadFile不会将文件加载到LoadFrom上下文中,也不会像LoadFrom方法那样使用加载路径解析依赖关系.LoadFile在这种有限的场景中很有用,因为LoadFrom不能用于加载具有相同标识但路径不同的程序集; 它只会加载第一个这样的组件.
我有一个复杂的库A,包含几个生成以下程序集的c#项目:
该库是由我编写的,我可以完全访问其源代码.这取决于几个NuGet包,假设它们是:
这些库(MongoDb驱动程序和EntLib)未安装在GAC中.
我还有一个Web项目B,我想在其中使用库A作为DLL的引用(不包括项目到解决方案B).Web项目依赖于几个NuGet包,其中包括:
在解决这些包的版本A,并B为他们没有同步发展不匹配.图书馆A是在一年前开发的,从那时起就一直使用.
问题:分发库的正确方法是什么,A以便:
A没有引用lib 依赖项,任何解决方案都可以使用它.A依赖项版本,则它们不会发生冲突.我目前的做法:
A.Core, A.Caching, A.Logging, A.MongoDb.B使用mongocsharpdriver 1.5版,lib A使用1.1版(版本不兼容).那么,我该怎么办?处理冲突引用与引用引用的正确方法是什么?
我需要在运行时"扫描"所有已加载程序集的活动AppDomain,并获取这些程序集中可用的唯一名称空间列表,.NET支持吗?
代码必须在运行时执行,以便代码是动态的.
我刚开始使用C#进行编码,所以我不确定从哪里开始,所以任何帮助都将受到赞赏.
最近我一直致力于一个项目,其中应用程序(或可执行文件,无论你想要什么)都需要能够加载和卸载在可执行文件夹中找不到的程序集.(甚至可能是另一个驱动器)
为了举个例子,我希望能够将我的应用程序放在D:\ AAA\theAppFolder中,并将DLL文件的程序集放在C:\ BBB\Assemblies
仔细观察,我发现AppDomain允许卸载自己和任何附加程序集的能力,所以我想我会试一试,但是经过几个小时的尝试后似乎有问题:AppDomains看不到外面的任何地方应用基础.
根据AppDomain的纪录片(以及我自己的经验)你不能在ApplicationBase之外设置PrivateBinPath,如果我在应用程序所在的驱动器之外设置ApplicationBase(通过AppDomainSetup),我得到System.IO.FileNotFoundException抱怨它不能找到应用程序本身.
因此我甚至无法达到可以使用AssemblyResolve ResolveEventHandler尝试使用MarhsalByRefObject继承类来获取程序集的阶段...
这里有一些与我目前正在尝试的代码相关的代码片段
internal class RemoteDomain : MarshalByRefObject
{
public override object InitializeLifetimeService() //there's apparently an error for marshalbyref objects where they get removed after a while without this
{
return null;
}
public Assembly GetAssembly(byte[] assembly)
{
try
{
return Assembly.Load(assembly);
}
catch (Exception e)
{
Console.WriteLine(e);
}
return null;
}
public Assembly GetAssembly(string filepath)
{
try
{
return Assembly.LoadFrom(filepath);
}
catch …Run Code Online (Sandbox Code Playgroud) 无论使用何种方法在程序集指令中指定文件,T4引擎都找不到指定的文件.
<#@ assembly name="$(SolutionDir)packages\TestPackage\lib\net45\Test.dll"#>
Run Code Online (Sandbox Code Playgroud)
或<#@ assembly name ="C:\ Test.dll"#>
或任何其他方法导致相同的未找到问题.模板引擎似乎能够读取文件并显示其版本信息,即使它找不到它.
Errors were generated when initializing the transformation object. The transformation will not be run. The following Exception was thrown:
System.IO.FileNotFoundException: Could not load file or assembly ‘Test, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)
表明缺少依赖性.程序集没有依赖关系.
为什么T4引擎找不到我的组件?
我有一个ASP MVC项目,我没有,但我需要将其上传到IIS服务器上.这有效,但当我上传并访问该网站时,我收到此错误:
Could not load file or assembly 'Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)
一切都在本地工作,但不在服务器上.我尝试过的事情:
我发现删除这两行可能是一个解决方案,但我不能删除它们:
<remove assembly="Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
Run Code Online (Sandbox Code Playgroud)
有什么我想念的吗?任何帮助深表感谢!谢谢
我有一个应用程序在运行时编写动态程序集,所以我需要一个包含我的系统中所有程序集的列表,如Visual Studio Reference Manager:
我的问题是:如何通过自己的语言获取所有.NET程序集的列表,.NET而无需搜索文件夹文件?
注意:
我知道我可以找到以下任何组件:
C:\Windows\assembly\GAC\...
或者
C:\Windows\Microsoft.NET\Framework
我不确定通过这种方式在所有系统中找到组件!
因为我无法访问所有计算机上的这些文件夹.所以我的应用程序只能通过.NET代码获取这些程序集的名称.而其他问题是所有计算机上此文件夹的路径都不固定,可能会有所不同.
我正在编写一个类库(称为mylibrary.dll),它本身引用了更多的库 - >使用以下DLL(从package.config获取版本概述):
<package id="EntityFramework" version="6.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net45" />
<package id="System.Data.SQLite" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.EF6" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.Linq" version="1.0.99.0" targetFramework="net45" />
<package id="UnmanagedExports" version="1.2.7" targetFramework="net45" />`
Run Code Online (Sandbox Code Playgroud)
mylibrary.dll是一个包装器,它将一些托管代码公开给需要非托管代码的调用者(换句话说,预期本机DLL条目的位置).
如果我通过NUnit测试方法测试mylibrary.dll的公共接口,则根本没有错误.但是,如果我通过targetapplication.exe的相同界面调用相同的方法,我会认识到以下情况:
var vResponseObject = await vResponse.Content.ReadAsAsync <ApiResponse <T >>().ConfigureAwait(false);
在幕后,ReadAsAsync调用使用Newtonsoft.JSON反序列化类型的对象<T>.看来这个函数是生成错误的函数:
无法加载文件或程序集'Newtonsoft.Json,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = ...........'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
HTTPContent.ReadAsAsync由Microsoft.AspNet.WebApi.Client(扩展System.Net.Http)提供,它本身依赖于Newtonsoft.JSON版本6.0.x(请参阅此程序包的NuGet依赖项).未安装版本6.0.x,而是安装版本8.0.x. 因此需要在app.config中管理的可装配重定向:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly> …Run Code Online (Sandbox Code Playgroud) 我正在使用Mono.Cecil来读取生成的程序集Regex.CompileToAssembly().当我遍历类型时,根命名空间中有一个名为的类型<Module>.该类型没有基本类型.这是什么类型的?这是一些Mono.Cecil工件还是实际上是.NET程序集的一部分?它起什么作用?
我在运行使用MSSSQL中的程序集的函数时收到以下错误:
消息10314,级别16,状态11,第36行尝试加载程序集ID 65800时,Microsoft .NET Framework中发生错误。服务器可能资源不足,或者PERMISSION_SET = EXTERNAL_ACCESS或UNSAFE可能不信任该程序集。再次运行查询,或查看文档以查看如何解决程序集信任问题。有关此错误的更多信息:System.IO.FileLoadException:无法加载文件或程序集“ exporttoexcel,Version = 0.76.0.0,Culture = neutral,PublicKeyToken = f73371c9a1809a3f”或其依赖项之一。来自HRESULT的异常:0x80FC80F1 System.IO.FileLoadException:位于System.Reflection.Assembly._nLoad(AssemblyName文件名,字符串codeBase,证据AssemblySecurity,程序集locationHint,StackCrawlMark&stackMark,布尔throwOnFileNotFound,
但是,在我重新创建函数和程序集之后,在一段时间内一切正常:
DROP FUNCTION [dbo].[fnExportToExcel]
DROP ASSEMBLY ExcelExporter
CREATE ASSEMBLY ExcelExporter
AUTHORIZATION [DOMAIN\ACCOUNT]
FROM 'ExportToExcel.dll'
WITH PERMISSION_SET = UNSAFE
CREATE FUNCTION [dbo].[fnExportToExcel](@Query [nvarchar](max), @FilePath [nvarchar](max), @FileName [nvarchar](max), @SheetNames [nvarchar](max))
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME ExcelExporter.[ExportToExcel_DLL.cls_ExcelExport].[ExportToExcel]
GO
Run Code Online (Sandbox Code Playgroud)
有什么想法可能导致MSSQL丢失程序集引用吗?
.net-assembly ×10
c# ×7
.net ×5
appdomain ×2
.net-4.5 ×1
asp.net-mvc ×1
assemblies ×1
cil ×1
clr ×1
dll ×1
dynamic ×1
file-io ×1
json.net ×1
mono.cecil ×1
nuget ×1
reference ×1
sql-server ×1
t4 ×1