我是.NET C#编程的新手.我跟着几本书.据说不是直接将其编译为二进制代码(Native code).高级代码转换为中间语言(称为MSIL aka CIL).但是当我编译时,我得到一个exe/Dll文件.
assembly.他们使用这个"花哨的词"只是为了区分这些包含二进制代码(本机代码)的exe/dll文件吗?我的DLL由第三方应用程序加载,我们无法自定义.我的程序集必须位于自己的文件夹中.我无法将它们放入GAC(我的应用程序需要使用XCOPY进行部署).当根DLL尝试从另一个DLL(在同一文件夹中)加载资源或类型时,加载失败(FileNotFound).是否可以以编程方式(从根DLL)将我的DLL所在的文件夹添加到程序集搜索路径?我不允许更改应用程序的配置文件.
我正在查看msdn文档,我仍然对使用LoadFile和LoadFrom加载程序集之间的区别究竟有点困惑.有人可以提供一个例子或类比来更好地描述它.MSDN文档让我更加困惑.此外,它是ReflectionOnlyLoadFrom相同的,LoadFrom只是它只在反射模式下加载程序集.
由于我的.NET经验并不是最好的,因此以下是有关使用LoadFile的MSDN文档的一些问题:
1)LoadFile检查具有相同标识但位于不同路径的程序集是什么意思?身份是什么(例子)?
2)它声明LoadFile不会将文件加载到"LoadFrom上下文"中,并且不会使用加载路径解析依赖关系.这是什么意思,有人可以提供一个例子吗?
3)最后,它声明LoadFile在这种有限的场景中很有用,因为LoadFrom无法加载具有相同身份但路径不同的程序集; 它只会加载第一个这样的组件,这再次带给我同样的问题,组件标识是什么?
我的ASP.NET应用程序中有一个"诊断"页面,它可以验证数据库连接,显示当前的appSettings和ConnectionStrings等.此页面的一部分显示了整个过程中使用的重要类型的程序集版本,但我无法弄清楚如何有效地显示所有已加载程序集的版本.
在.NET应用程序中找出所有当前引用和/或加载的程序集的最有效方法是什么?
注意:我对基于文件的方法不感兴趣,比如在特定目录中迭代*.dll.我对应用程序实际使用的内容感兴趣.
我想加载到一个新的AppDomain一些具有复杂引用树的程序集(MyDll.dll - > Microsoft.Office.Interop.Excel.dll - > Microsoft.Vbe.Interop.dll - > Office.dll - > stdole.dll)
据我所知,当加载程序集时AppDomain,它的引用不会自动加载,我必须手动加载它们.所以当我这样做时:
string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory
string path = System.IO.Path.Combine(dir, "MyDll.dll");
AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
setup.ApplicationBase = dir;
AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);
domain.Load(AssemblyName.GetAssemblyName(path));
Run Code Online (Sandbox Code Playgroud)
得到了FileNotFoundException:
无法加载文件或程序集"MyDll,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"或其依赖项之一.该系统找不到指定的文件.
我认为关键部分是其依赖性之一.
好的,我之前做过 domain.Load(AssemblyName.GetAssemblyName(path));
foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies())
{
domain.Load(refAsmName);
}
Run Code Online (Sandbox Code Playgroud)
但FileNotFoundException又一次,在另一个(参考)集会上.
如何递归加载所有引用?
在加载根程序集之前是否必须创建引用树?如何在不加载程序集的情况下获取程序集的引用?
在.NET BCL中有以下循环引用:
System.dll 和 System.Xml.dllSystem.dll 和 System.Configuration.dllSystem.Xml.dll 和 System.Configuration.dll这是.NET Reflector的截图,显示了我的意思:

微软如何创建这些程序集对我来说是一个谜.是否需要特殊的编译过程才允许这样做?我想象这里有一些有趣的东西.
我在_Layout.cshtml文件的页脚中使用以下代码将AssemblyInfo版本数据放入我的MVC3站点中每个页面的页脚.然而:
@System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()
Run Code Online (Sandbox Code Playgroud)
只需在页脚中打印:
Revision 0.0.0.0
Run Code Online (Sandbox Code Playgroud)
当我修改视图以使用以下内容显示"执行装配"的所有装配信息时
@System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()
Run Code Online (Sandbox Code Playgroud)
其中打印以下内容:
Revision App_Web__layout.cshtml.639c3968.hlogy75x, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Run Code Online (Sandbox Code Playgroud)
这表明"执行程序集"不是我的主要应用程序,它是视图本身.
如何获取ACTUAL应用程序的程序集信息,而不仅仅是单个视图?
在.Net中,我想枚举所有AppDomains上的所有已加载程序集.为我的程序的AppDomain做这件事很容易AppDomain.CurrentDomain.GetAssemblies().我是否需要以某种方式访问每个AppDomain?或者是否已有一个工具可以做到这一点?
我想要做的是改变C#方法在调用时的执行方式,这样我就可以编写如下内容:
[Distributed]
public DTask<bool> Solve(int n, DEvent<bool> callback)
{
for (int m = 2; m < n - 1; m += 1)
if (m % n == 0)
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我需要能够分析具有Distributed属性(我已经可以做)的方法,然后在函数体执行之前和函数返回之后插入代码.更重要的是,我需要能够在不修改调用Solve的代码的情况下或在函数的开头修改代码(在编译时;在运行时这样做是目标).
目前我尝试了这段代码(假设t是Solve存储的类型,m是Solve的MethodInfo):
private void WrapMethod(Type t, MethodInfo m)
{
// Generate ILasm for delegate.
byte[] il = typeof(Dpm).GetMethod("ReplacedSolve").GetMethodBody().GetILAsByteArray();
// Pin the bytes in the garbage collection.
GCHandle h = GCHandle.Alloc((object)il, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
int size = il.Length;
// Swap the method.
MethodRental.SwapMethodBody(t, m.MetadataToken, …Run Code Online (Sandbox Code Playgroud) 你能解释一下C#或.NET中的程序集是什么吗?