标签: .net-assembly

JIT代码生成技术

虚拟机如何动态生成本机代码并执行它?

假设您可以确定要发出的本机机器操作码是什么,那么您如何实际运行它?

将助记符指令映射到二进制代码,将其填充到char*指针并将其作为函数进行转换并执行是不是很麻烦?

或者你会生成一个临时共享库(.dll或.so或其他)并使用标准函数将其加载到内存中LoadLibrary吗?

interpreter jit .net-assembly

19
推荐指数
2
解决办法
1525
查看次数

加载插件DLL文件,"动态程序集中不支持调用的成员".

我们有自定义DLL,它们不包含在我们的初始设置文件中.它们在运行时加载.这个过程在使用.NET 2.0时运行良好,但是我们现在正在使用.NET 4.0获得"动态程序集中不支持调用的成员"错误消息.

try
{
    assem = Assembly.LoadFrom(fi.FullName); //fi is FileSystemInfo
}
catch (FileLoadException) {}
catch (BadImageFormatException) {}
catch (System.Security.SecurityException) {}
catch (ArgumentException) {}
catch (PathTooLongException) {}
Run Code Online (Sandbox Code Playgroud)

c# .net-4.0 .net-assembly .net-2.0 dynamic-assemblies

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

是否可以通过.NET安装x86汇编程序?

我可以通过C#调用x86汇编程序这样的东西吗?我希望能够将x86指令作为字符串传递并获取字节数组.如果不存在,我该如何制作自己的?

要清楚 - 我不想从C#调用汇编代码 - 我只是希望能够从指令汇编代码并以字节数组获取机器代码.我将注入这个代码(将在运行中生成)以完全注入另一个进程.

c# x86 .net-assembly

18
推荐指数
1
解决办法
6723
查看次数

什么是缓存AppData\Local\assembly\dl3?

我有这个程序集,由于某种原因Windows开始从这个路径加载:

C:\Users\marius\AppData\Local\assembly\dl3\MP6PT6BV.2Z4\GMRQEZL9.LCB\46d762c5\8cf066ff_7eaecc01\X.DLL
Run Code Online (Sandbox Code Playgroud)

这意味着我对程序集所做的任何更改,它的新副本不会从其输出文件夹加载,而是从该缓存文件夹加载.我尝试删除该文件夹,甚至重新启动Windows,它再次生成并从那里加载程序集.

那么,我怎么能摆脱它呢?我该怎么做才能告诉系统从其输出文件夹而不是从缓存加载DLL?

.net caching .net-assembly

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

向.NET-Application添加多个图标(Win32-Resource)

可以在项目属性中设置应用程序图标.如果你这样做,exe将有这个图标而不是默认的图标.此图标是win32资源,也可以像这样访问:

改变图标

我希望有我的程序使用的文件类型的特殊图标.关联filetype-icon我可以在注册表中指定它("DefaultIcon"键中的"MyProg.exe,1").

那么如何添加更多图标到程序集,我可以将它用于filetype-association?

非常感谢你

ps:它是一个WPF应用程序(.NET 4.0)

.net c# icons .net-assembly

18
推荐指数
2
解决办法
8038
查看次数

跨组件的本机映像的内联方法

正如在另一个问题中所解释的,如果方法设置了TargetedPatchingOptOutAttribute,则通常只允许Ngen跨组件内联方法.

但是,通过使用DependencyAttribute,对于硬绑定程序集也是如此吗?LoadHint.Always

编辑:也许我的初始问题的答案是否定的,否则TargetedPatchingOptOutAttribute在mscorlib中使用它是没有意义的,因为这个程序集总是硬绑定(它设置了DefaultDependencyAttribute).所以我想重新解释一下我的问题:是否可以在TargetedPatchingOptOutAttribute组件的原生图像中内联方法?

.net ngen .net-assembly

18
推荐指数
1
解决办法
3318
查看次数

.Net 4.6网站未正确加载参考装配

我在Visual Studio 2013中有一个Web项目,包括几个库项目.

问题是向Web项目添加引用(即System.Collection,System.Net)作为"引用程序集"添加C:\Program Files (x86)\Reference Assemblies\Microsoft,当在IIS中加载时,它没有正确加载程序集的实现(来自GAC) .示例错误如下.

[BadImageFormatException: Cannot load a reference assembly for execution.]

[BadImageFormatException: Could not load file or assembly 'System.Collections' or one of its dependencies. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net iis .net-assembly

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

调用Microsoft.Owin.Cors后无法加载System.Web.Cors程序集

当我System.Web.Cors在解决方案资源管理器中检查程序集引用时,它Version5.2.3.0.该Specific Version物业将设置为False.路径是本地项目bin文件夹.从文件资源管理器中检查.dll属性时,文件的产品版本和文件版本.也是5.2.3.

我的Web.config:

<dependentAssembly>
    <assemblyIdentity name="System.Web.Cors" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

我的packages.config(我认为麻烦的程序集是Microsoft.AspNet.WebApi.Cors,但我在这里包含另一个类似名称):

<package id="Microsoft.AspNet.Cors" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Cors" version="5.2.3" targetFramework="net452" />
Run Code Online (Sandbox Code Playgroud)

Startup.cs中抛出此行的错误

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
Run Code Online (Sandbox Code Playgroud)

这是完整的错误:

System.IO.FileLoadException was unhandled by user code
  FileName=System.Web.Cors, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
  FusionLog==== Pre-bind state information ===
LOG: DisplayName = System.Web.Cors, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Appbase = file:///P:/project-z4a/project-z4a/
LOG: Initial PrivatePath = P:\project-z4a\project-z4a\bin …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net .net-assembly asp.net-web-api

18
推荐指数
1
解决办法
3万
查看次数

'无法加载文件或程序集'netstandard,Version = 2.0.0.0,...'.不应加载引用程序集以执行

目标: 从.NET 4.7控制台应用程序,使用Assembly.GetType()的反射,我尝试从程序集X中提取netstandard 2.0类的类型.然后我想用Activator.CreateInstance()创建此类型的实例.

我想要做的是: 但是,这个程序集X依赖于netstandard 2.0.为了能够获取Type,必须将netstandard依赖项加载到AppDomain中.这就是为什么当AppDomain通过AssemblyResolve事件请求netstandard程序集时,我只需加载这样的dll:

var netStandardDllPath = @"C:\Users\xxx\.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll";

return Assembly.LoadFrom(netStandardDllPath);
Run Code Online (Sandbox Code Playgroud)

哪个投掷:

System.BadImageFormatException:'无法加载文件或程序集'文件:/// C:\ Users\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build \netstandard2.0\ref \netstandard.dll'或其依赖项之一.不应加载引用程序集以执行.它们只能在Reflection-only loader上下文中加载.(HRESULT异常:0x80131058)'

内部异常:BadImageFormatException:无法加载引用程序集以执行.

我所知道的: 我知道他们希望我们使用Assembly.ReflectionOnlyLoadFrom加载DLL.但这样做会阻止我使用Activator.CreateInstance()实现类型.请参阅Microsoft官方帖子

另外,我尝试在我的控制台应用程序中引用Nuget软件包NETStandard.Library 2.0.0-preview1-25301-01和NETStandard.Library.NETFramework 2.0.0-preview1-25305-02,这样它就会引用netstandard 2.0库,但是它没有改变任何东西.

问题: 有没有人知道是否有正确的方法来加载该DLL而没有错误,或者可能是否是一个错误,或者?或者为什么这种DLL无法加载执行?

.net c# dll .net-assembly .net-standard

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

PowerShell和Server Manager模块的跨平台系统库参考

我正在编写的程序正在使用System.Management.Automation库来使用那里定义的powershell类和接口.这些库有两个版本:1.0.0.0和3.0.0.0.Windows Server 2008在其GAC版本1.0中,Windows Server 2012在其GAC中具有1.0和3.0.

为了能够在VS项目中使用此库,我必须引用它.现在这是一个决定,我应该参考哪一个?好吧,既然两台服务器的GAC都是1.0,那么引用1.0的服务器应该是安全的.不过,为了以防万一,我会在本地复制它,如果有一些罕见的(或常见的?)情况,它在GAC中不存在.

使用此库的示例代码:

using (PowerShell PS = PowerShell.Create())
{

    PS.AddScript("Import-Module ServerManager")
        .Invoke();
}
Run Code Online (Sandbox Code Playgroud)

Import-Module Servermanager命令导致powershell导入另一个dll , Microsoft.Windows.ServerManager. 问题开始了.

Windows Server 2008只有此库的版本6.1.0.0,其中Windows Server 2012的版本为6.3.0.0.我假定Automation的1.0〜6.1和3.0〜6.3版本相似度不巧合.

当我在Windows Server 2008上使用我的程序时,它工作正常,但当我尝试在Windows Server 2012上使用它时,此Automation 1.0程序集正在尝试加载2012年没有的ServerManager程序集版本6.1(!).2012年更愿意使用Automation assembly v3.0并加载ServerManager v6.3.

我假设有一些方法可以"告诉"程序加载程序集X,如果服务器版本Y和程序集A,如果服务器版本B,但它在哪里?我怎么能确定我不会遇到一些服务器,其中将有2.0或4.0或其他版本.

问题是我无法引用(本地复制)ServerManager程序集,因为(我认为),只要我能"告诉" 我的程序应该在哪里查找程序集,我无法告诉自动化程序集在何处查找其他组件.通过使用procmon进行分析,我可以看到它确切地知道在哪里寻找,因为它立即导航C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager到寻找ServerManager程序集.

我所知道的可能解决方案是:

  1. 我可以尝试动态加载程序集而不引用它们在视觉研究中使用Assembly.Load()dynamic对象使用,如有人建议的那样,我应该在火热的地狱中燃烧(我假设那个人提到它非常容易出错).

  2. 我可以将我需要的程序集添加到GAC,但这可能导致一些依赖地狱,因为Automation和ServerManager可能有很多其他依赖项,我现在才发现其中的两个.

我还有其他选择吗?

c# powershell .net-assembly visual-studio-2012

17
推荐指数
1
解决办法
272
查看次数