标签: assemblies

如何查看C#编译器生成的MSIL/CIL?为什么叫组装?

我是.NET C#编程的新手.我跟着几本书.据说不是直接将其编译为二进制代码(Native code).高级代码转换为中间语言(称为MSIL aka CIL).但是当我编译时,我得到一个exe/Dll文件.

  1. 这些exe/dll文件中是否包含此MSIL/CIL?
  2. 我想看看那个中间语言代码.只是为了感受它的存在.怎么看?
  3. 他们正在调用这个exe/dll文件assembly.他们使用这个"花哨的词"只是为了区分这些包含二进制代码(本机代码)的exe/dll文件吗?

.net c# assemblies

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

如何在.NET中运行时将文件夹添加到程序集搜索路径?

我的DLL由第三方应用程序加载,我们无法自定义.我的程序集必须位于自己的文件夹中.我无法将它们放入GAC(我的应用程序需要使用XCOPY进行部署).当根DLL尝试从另一个DLL(在同一文件夹中)加载资源或类型时,加载失败(FileNotFound).是否可以以编程方式(从根DLL)将我的DLL所在的文件夹添加到程序集搜索路径?我不允许更改应用程序的配置文件.

.net search assemblies path

120
推荐指数
8
解决办法
9万
查看次数

LoadFile和LoadFrom与.NET程序集之间的区别?

我正在查看msdn文档,我仍然对使用LoadFileLoadFrom加载程序集之间的区别究竟有点困惑.有人可以提供一个例子或类比来更好地描述它.MSDN文档让我更加困惑.此外,它是ReflectionOnlyLoadFrom相同的,LoadFrom只是它只在反射模式下加载程序集.

由于我的.NET经验并不是最好的,因此以下是有关使用LoadFile的MSDN文档的一些问题:

1)LoadFile检查具有相同标识但位于不同路径的程序集是什么意思?身份是什么(例子)?

2)它声明LoadFile不会将文件加载到"LoadFrom上下文"中,并且不会使用加载路径解析依赖关系.这是什么意思,有人可以提供一个例子吗?

3)最后,它声明LoadFile在这种有限的场景中很有用,因为LoadFrom无法加载具有相同身份但路径不同的程序集; 它只会加载第一个这样的组件,这再次带给我同样的问题,组件标识是什么?

.net assemblies assembly-loading system.reflection

119
推荐指数
3
解决办法
5万
查看次数

如何循环当前加载的程序集?

我的ASP.NET应用程序中有一个"诊断"页面,它可以验证数据库连接,显示当前的appSettings和ConnectionStrings等.此页面的一部分显示了整个过程中使用的重要类型的程序集版本,但我无法弄清楚如何有效地显示所有已加载程序集的版本.

在.NET应用程序中找出所有当前引用和/或加载的程序集的最有效方法是什么?

注意:我对基于文件的方法不感兴趣,比如在特定目录中迭代*.dll.我对应用程序实际使用的内容感兴趣.

.net assemblies

118
推荐指数
2
解决办法
3万
查看次数

如何以递归方式将所有引用加载到AppDomain的程序集?

我想加载到一个新的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 c# reflection assemblies appdomain

108
推荐指数
7
解决办法
12万
查看次数

Microsoft如何创建具有循环引用的程序集?

在.NET BCL中有以下循环引用:

  • System.dllSystem.Xml.dll
  • System.dllSystem.Configuration.dll
  • System.Xml.dllSystem.Configuration.dll

这是.NET Reflector的截图,显示了我的意思:

在此输入图像描述

微软如何创建这些程序集对我来说是一个谜.是否需要特殊的编译过程才允许这样做?我想象这里有一些有趣的东西.

.net assemblies circular-reference base-class-library

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

使用Razor/MVC3将AssemblyVersion导入网页时出现问题

我在_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应用程序的程序集信息,而不仅仅是单个视图?

c# reflection assemblies razor asp.net-mvc-3

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

如何列出所有已加载的程序集?

在.Net中,我想枚举所有AppDomains上的所有已加载程序集.为我的程序的AppDomain做这件事很容易AppDomain.CurrentDomain.GetAssemblies().我是否需要以某种方式访问​​每个AppDomain?或者是否已有一个工具可以做到这一点?

.net c# assemblies

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

动态替换C#方法的内容?

我想要做的是改变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# methods swap cil assemblies

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

C#或.NET中的程序集究竟是什么?

你能解释一下C#或.NET中的程序集是什么吗?

  1. 它从哪里开始,它在哪里结束?
  2. 我应该了解哪些关于装配的重要信息?

.net c# assemblies

83
推荐指数
5
解决办法
6万
查看次数