虚拟机如何动态生成本机代码并执行它?
假设您可以确定要发出的本机机器操作码是什么,那么您如何实际运行它?
将助记符指令映射到二进制代码,将其填充到char*指针并将其作为函数进行转换并执行是不是很麻烦?
或者你会生成一个临时共享库(.dll或.so或其他)并使用标准函数将其加载到内存中LoadLibrary吗?
我们有自定义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#调用x86汇编程序这样的东西吗?我希望能够将x86指令作为字符串传递并获取字节数组.如果不存在,我该如何制作自己的?
要清楚 - 我不想从C#调用汇编代码 - 我只是希望能够从指令汇编代码并以字节数组获取机器代码.我将注入这个代码(将在运行中生成)以完全注入另一个进程.
我有这个程序集,由于某种原因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?
可以在项目属性中设置应用程序图标.如果你这样做,exe将有这个图标而不是默认的图标.此图标是win32资源,也可以像这样访问:

我希望有我的程序使用的文件类型的特殊图标.关联filetype-icon我可以在注册表中指定它("DefaultIcon"键中的"MyProg.exe,1").
那么如何添加更多图标到程序集,我可以将它用于filetype-association?
非常感谢你
ps:它是一个WPF应用程序(.NET 4.0)
正如在另一个问题中所解释的,如果方法设置了TargetedPatchingOptOutAttribute,则通常只允许Ngen跨组件内联方法.
但是,通过使用DependencyAttribute,对于硬绑定程序集也是如此吗?LoadHint.Always
编辑:也许我的初始问题的答案是否定的,否则TargetedPatchingOptOutAttribute在mscorlib中使用它是没有意义的,因为这个程序集总是硬绑定(它设置了DefaultDependencyAttribute).所以我想重新解释一下我的问题:是否可以在TargetedPatchingOptOutAttribute组件的原生图像中内联方法?
我在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) 当我System.Web.Cors在解决方案资源管理器中检查程序集引用时,它Version是5.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 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无法加载执行?
我正在编写的程序正在使用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程序集.
我所知道的可能解决方案是:
我可以尝试动态加载程序集而不引用它们在视觉研究中使用Assembly.Load()和dynamic对象使用,如有人建议的那样,我应该在火热的地狱中燃烧(我假设那个人提到它非常容易出错).
我可以将我需要的程序集添加到GAC,但这可能导致一些依赖地狱,因为Automation和ServerManager可能有很多其他依赖项,我现在才发现其中的两个.
我还有其他选择吗?
.net-assembly ×10
c# ×7
.net ×6
asp.net ×2
.net-2.0 ×1
.net-4.0 ×1
caching ×1
dll ×1
icons ×1
iis ×1
interpreter ×1
jit ×1
ngen ×1
powershell ×1
x86 ×1