标签: assemblies

修改现有的.NET程序集

有没有办法修改现有的.NET程序集而不诉诸第三方工具?我知道PostSharp使这成为可能,但我发现PostSharp的开发人员基本上必须重写整个System.Reflection命名空间的功能以使现有的程序集可修改,这令人难以置信地浪费.

System.Reflection.Emit只允许创建新的动态程序集.但是,此处使用的所有构建器类都继承自基本反射类(例如,TypeBuilder继承自System.Type).不幸的是,似乎没有办法将现有的动态加载类型强制转换为类型构建器.至少,没有正式的,受支持的方式.

那么不支持呢?有没有人知道允许将现有程序集或类型加载到此类构建器类中的后门程序?

记住,我不是在寻找修改当前程序集的方法(这可能是一个不合理的请求),而只是修改从光盘加载的现有程序集.我担心没有这样的事情,但无论如何我还是想问.

在最坏的情况下,人们不得不求助于ildasm.exe反汇编代码然后ilasm.exe重新组装,但是.NET中没有工具链(读取:IL读取器)来处理IL数据(或者在那里?).

/编辑:

我没有具体的用例.我只是对通用解决方案感兴趣,因为修补现有的程序集是一项非常常见的任务.以混淆器为例,或者分析器或AOP库(是的,后者可以以不同的方式实现).正如我所说,被迫重写现有基础设施的大部分内容似乎非常浪费System.Reflection.


@楔:

你是对的.但是,这里没有具体的用例.我修改了原始问题以反映这一点.我的兴趣是由另一个问题引发的,其中提问者想要知道如何注入指令pop以及ret在每种方法的最后,以便让Lutz Roeder的Reflector不再重新设计(VB或C#)源代码.

现在,这个场景可以通过许多工具实现,例如上面提到的PostSharp和Reflector 的Reflexil插件,而这些工具又使用Cecil库.

总而言之,我对.NET框架不满意.

@Joel:

是的,我知道这个限制.无论如何,谢谢你指出它,因为它很重要.

@marxidad:

这似乎是唯一可行的方法.但是,这意味着您仍然需要使用构建器类重新创建完整的程序集,对吧?也就是说,你必须手动遍历整个组件.

嗯,我会调查一下.

.net reflection cil assemblies reflection.emit

15
推荐指数
2
解决办法
9246
查看次数

从全名创建C#类型

我正在尝试从类型全名获取一个Type对象,我正在进行以下操作:

Assembly asm = Assembly.GetEntryAssembly();  
string toNativeTypeName="any type full name";
Type t = asm.GetType(toNativeTypeName);
Run Code Online (Sandbox Code Playgroud)

我搞砸了,为什么?

程序集是我的可执行文件(.net可执行文件),类型名称是:System.Xml.XmlNode

c# types assemblies

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

如何从maven程序集插件中添加清单中的任意信息

我使用程序集插件从几个maven工件创建一个超级jar.

现在,我想在创建的程序集jar的Manifest中添加一些公司特定的条目.

但是怎么样?

所述archive元件犯规允许任意元素(或者是有一个方法来添加foobar: tutu内部archive标签?)

此外,maven-jar-plugin它不起作用,因为这只影响项目的默认工件,而不是组装.

知道怎么做吗?

maven-2 assemblies manifest maven-plugin maven-assembly-plugin

15
推荐指数
1
解决办法
4242
查看次数

C#:自定义程序集目录

假设我们有一个由一个可执行文件和5个库组成的应用程序.通常所有这些都将包含在一个目录中,并且将从那里加载库.

是否有可能这样做,例如我可以在一个名为Lib的目录中拥有一些库,其余的名为Lib2?这样应用程序目录只包含可执行文件本身,其他程序集将包含在各种逻辑目录中.

我怎样才能做到这一点?我想知道如何加载程序集,以及如何使应用程序的构建将程序集放在正确的目录中.

c# assemblies assembly-resolution

14
推荐指数
2
解决办法
1万
查看次数

Assembly.GetTypes() - ReflectionTypeLoadException

我们为我们的应用程序实现了一个插件框架,并使用Assembly.Loadfrom加载插件程序集.然后我们使用GetTypes()并进一步检查每个插件文件的类型以获得支持的接口.

用户提供了插件的路径,我们循环浏览文件夹中的每个文件,看看它(插件)是否支持我们的插件界面.如果是,我们创建一个实例,如果不是,我们移动到下一个文件.

我们从一个代码库(appA_1和appA_2)构建两个版本的软件.

当插件由与插件文件同时构建的应用程序加载时,加载插件很有效.但是,如果我们构建appA_2并指向appA_1的插件文件夹,则在调用GetTypes()时会出现异常.

我们代码的基本版本是;

var pluginAssembly = Assembly.LoadFrom(FileName);    
foreach (var pluginType in pluginAssembly.GetTypes())
{
Run Code Online (Sandbox Code Playgroud)

我们得到一个"ReflectionTypeLoadException"异常.

这是令人担忧的,因为我们希望我们的应用程序能够加载由任何人构建的任何插件的类型.我们缺少什么?

编辑:在遍历LoaderExceptions之后,我们发现有一个文件libPublic.dll会生成System.IO.FileNotFoundException异常.奇怪的是,该文件驻留在应用程序目录中,插件被引用到项目文件中.

编辑2:在异常日志中,我们发现以下"比较程序集名称导致不匹配:修订号"

c# reflection plugins assemblies

14
推荐指数
1
解决办法
2万
查看次数

什么时候应该使用[assembly:InternalsVisibleTo()]?

我知道InternalVisibleTo属性用于使用内部访问修饰符向指定的程序集公开类型和方法.我只使用它来将内部方法暴露给包含一组单元测试的单独程序集.

我正在努力想到应该使用它的另一个场景.该属性是否专门用于辅助单元测试,还是有其他原因?

.net assemblies access-modifiers internalsvisibleto

14
推荐指数
3
解决办法
2718
查看次数

Is there a ILMerge equivalent tool for Mono?

I'm looking for a open source tool to merge multiple .NET assemblies into a single assembly.

c# mono ilmerge assemblies

14
推荐指数
2
解决办法
3758
查看次数

通过Bytes加载程序集会丢失该位置

我想通过以下方式加载程序集

var loadedAssembly = Assembly.Load(File.ContentsAsBytes);

File.ContentAsBytes byte[]通过以下方式将dll作为a返回

System.IO.File.ReadAllBytes("dll location");

问题是加载的程序集(loadedAssembly)失去了它的物理位置

  • loadedAssembly.CodeBase - 设置为加载它的程序集(这是不正确的)
  • loadedAssembly.Location - 为空

有没有办法从a加载byte[]并获得类似的结果,Assembly.LoadFile因为我需要使用结果来处理AppDomain.CurrentDomain.AssemblyResolve

c# reflection assemblies

14
推荐指数
2
解决办法
2640
查看次数

在Mono中使用预编译的.NET程序集DLL?

我们目前正在测试Mono,看看我们的.NET DLL是否适用于Linux上的客户.我们的DLL为Windows窗体提供组件.我将DLL放在Debug目录中,添加了引用,并创建了一个从Windows窗体派生的类.该类运行良好独立,但在我添加了DLL引用并创建了我们的一个组件(intellisense工作正常)后,它编译但不会运行:

** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies.

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies.
File name: 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN'

我查看了程序集的属性,它是带有该公钥的版本.

有没有办法让我使用这些DLL?我究竟做错了什么?

编辑:

根据MoMA的说法,除了一些与情况无关的[MonoTodo]之外,其中三个DLL存在一个问题:

Calling Method | P/Invoke Method | P/Invoke Library
void OnHandleCreated (EventArgs) | int GoText/ComboBoxControl.SetWindowTheme (IntPtr, string, string) | uxtheme.dll

但是,我打开了一个用VS2008创建的示例项目,在正确的位置指向DLL的引用,它工作正常.但我无法获得在新项目中工作的参考.难道我做错了什么?

编辑2:为了澄清,我们不想重新创建现有的Windows应用程序 - 我们正在模拟客户使用我们的dll创建一个新的应用程序.我只是测试它是否是一个DLL问题.由于VS制作的应用程序能够找到dll并成功运行,看起来这不是一个DLL问题.新应用程序不会调用VS创建的应用程序所没有的任何内容.

.net c# dll mono assemblies

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

在未引用的程序集中定义的C#类型

我有两个项目A和B.项目A在项目B中使用了类型X,所以我在A中添加了B的引用.一切都很好.

我使用强大的命名密钥文件签署了项目B. 一切仍然很好.

然后我决定更改B的强命名密钥文件.我重建了项目B ok.当我尝试构建项目AI时收到错误"错误1类型X在未引用的程序集中定义.您必须添加对程序集B的引用,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 95b41b0d6571627b'. "

所以我删除了项目A中的引用并将其重新添加回来,没有任何乐趣.我可以dbl点击项目A中的项目B引用,打开对象浏览器并在那里看到类型X确定.我也完全限定了A中的X型对象,而intellisense对它们进行了很好的检测,但它仍然没有构建.

我认为更改密钥文件我可能需要更新版本,所以我将程序集B版本更改为2.0.0.0但仍抱怨它需要版本1.0.0.0.查看A中B引用的属性,它肯定指向正确的版本,实际上它显示为2.0.0.0

我可以使用现有的密钥文件但我想知道如果可能的话我会在哪里出错.

c# assemblies reference

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