我使用"InternalsVisibleTo"属性和程序集将内部方法/类公开给我的单元测试项目.
我现在需要将该程序集安装到GAC中,因此我需要给它一个强名称.当我尝试这样做时,我在Visual Studio中收到以下错误.
强名称签名程序集必须在其InternalsVisibleTo声明中指定公钥
一点谷歌搜索带我到下面的文章:
https://msdn.microsoft.com/en-us/library/bb763089.aspx
本文指出:
"确定强名友人集会的公钥."
本文未说明如何确定公钥.我在哪里可以找到装配的公钥?此外,一旦我有公钥,这是否是声明属性的正确方法?
[assembly: InternalsVisibleTo("Namespace.Assembly.Example.Name, PublicKey=ThePublicKey")]
Run Code Online (Sandbox Code Playgroud) 我想发布一个MVC项目,我一直收到这个错误:
System.IO.FileNotFoundException:无法加载文件或程序集"Microsoft.Web.XmlTransform",Version = 1.4.0.0,Culture = neutral,PublicKeyToken = ...或其依赖项之一.该系统找不到指定的文件.
我搜索并尝试在SO或MSDN上找到的一些解决方案无济于事.我真的很想要一些建议.该项目之前已成功发布,但在尝试重新发布我的更新版本后,这个问题突然出现了.
我有一个插件架构,其中在主应用程序中定义了一个抽象基类.它使用反射来加载具有基类的派生实现的程序集.我想获取包含派生对象的程序集的版本信息.这是我的基类:
namespace My.AppNameSpace
{
public abstract class BaseClass
{
public Version Version
{
get
{
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
return new Version(version);
}
}
public abstract void DoStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
由于基类是主应用程序集的一部分,因此它始终返回正在执行的应用程序的版本信息,而不是包含派生类实现的.dll.我可以将版本访问器更改为abstract
,并且它可以按照我的意愿运行.但是我需要在每个实现插件中添加相同的几行代码.
是否有一些技巧从一个单独的程序集中存在的基类中的代码中获取派生对象的版本信息?
我试图检测我的CPU的当前p状态.我注意到p-state状态MSR(C001_0063)总是在我的ryzen 1700x系统上返回2,即使核心显然不在该状态.我认为它曾经用于我的主板附带的初始BIOS(v0403),但是不能再下载了1.
我的CPU超频2到3.8GHz.我曾经cpufreq-set
修复速度并cpufreq-info
验证:
analyzing CPU 0:
driver: acpi-cpufreq
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 4294.55 ms.
hardware limits: 2.20 GHz - 3.80 GHz
available frequency steps: 3.80 GHz, 2.20 GHz
available cpufreq governors: ondemand, conservative, performance, schedutil
current policy: frequency should be within 3.80 GHz and 3.80 GHz.
The governor "performance" may decide …
Run Code Online (Sandbox Code Playgroud) 我在linux终端中用gdb调试ac程序,我把它拆开并运行它,然后试图找到EIP寄存器的内存地址.这就是发生的事情:
(gdb)ir eip无效的寄存器`eip'
为什么说我的eip寄存器无效?
我MSB3277
在VS2015 RC中构建项目时收到错误代码.完整的信息是:
1> C:\程序文件(x86)\的MSBuild\14.0\BIN\Microsoft.Common.CurrentVersion.targets(1819,5):警告MSB3277:不同版本的相同依赖性组装的该不能被解析之间实测值冲突.当日志详细程度设置为详细时,这些引用冲突将在构建日志中列出.
所以我这样做了,我将输出更改为详细信息以查看发生了什么.
我的app.config看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Primitives" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
<bindingRedirect oldVersion="3.9.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
出现了更详细的错误:
2>考虑将版本"System.Net.Primitives,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"的app.config重新映射从版本"3.9.0.0"[]到版本"4.0.0.0"[C:\ Program Files(x86)\参考Assemblies\Microsoft\Framework\MonoAndroid\v1.0\Facades\System.Net.Primitives.dll]解决冲突并摆脱警告.
在app.config
绑定,我曾经尝试都0.0.0.0-4.0.0.0
为oldVersion
并指定一个确切的oldVersion
,但结果都以同样的方式.
当我去System.Net.Http.Primitives
它的属性时说:
v4.0.30319
1.5.0.0
这是一个Xamarin项目,如果这无关紧要的话.
查看以下汇编代码:
MOV ESI, DWORD PTR [EBP + C]
MOV ECX, EDI
MOV EAX, EAX
SHR ECX, 2
LEA EDI, DWORD PTR[EBX + 18]
REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI]
MOV ECX, EAX
AND ECX, 3
REP MOVS BYTE PTR ES:[EDI], BYTE PTR[ESI]
Run Code Online (Sandbox Code Playgroud)
我得到代码摘录的书解释了第一个REP MOVS
复制4字节块,第二个REP MOVS
复制剩余的2字节块(如果存在).
REP MOVS
说明书如何运作?根据MSDN,"该指令可以用REP作为前缀,重复操作ecx寄存器指定的次数." 难道不会一遍又一遍地重复同样的操作吗?
我认为这实际上是一个非常简单的问题.我必须将此汇编代码反向工程为c代码.我还会提供我认为正在发生的事情,这样你就可以指出我哪里出错了,现在我可以从错误中吸取教训.
.LFBO
pushq %rbp
movq %rsp,%rbp
movl %edi,-4(%rbp)
movl %esi,-8(%rbp)
movl -4(%rbp),%eax
compl -8(%rbp),%eax
jg .L2
movl -8(%rbp),%eax
jmp .L3
.L2:
movl -4(%rbp),%eax
.L3:
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
所以这就是我认为正在发生的事情:.LFBO之后的前两行:
pushq %rbp
movq %rsp,%rbp
Run Code Online (Sandbox Code Playgroud)
只是为即将执行的执行设置堆栈.
movl %edi,-4(%rbp)
Run Code Online (Sandbox Code Playgroud)
抓住第一个变量,称之为x
movl %esi,-8(%rbp)
Run Code Online (Sandbox Code Playgroud)
抓住第二个变量称之为y
movl -4(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)
抓住x在下一行进行比较
compl -8(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)
通过计算xy来比较变量x和y
jg .L2
Run Code Online (Sandbox Code Playgroud)
如果x> y,则跳转到.L2
如果x <= y则计算下一行而不跳转到.L2
movl -8(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)
复制x = y
jmp .L3
Run Code Online (Sandbox Code Playgroud)
跳到.L3
如果x> y在jg行,那么你跳转到.L2:并完成这一行
movl -4(%rbp),%eax
Run Code Online (Sandbox Code Playgroud)
这是我意识到我真的很困惑的地方.在我看来,你正在将x复制到x然后.L3已经完成,我想x是返回的
c assembly reverse-engineering x86-64 conditional-statements
我有2个申请.示例App1和App2运行时,正常App1将显示程序集可执行位置.但是当我从App2调用App1时,它返回App2启动位置.
那么,当从App2调用App1时,如何让App1启动路径?
我有一个.NET 4.5应用程序,在大多数环境中都可以正常运行和运行; 但是,应用程序的一个区域会在某些客户端计算机上引发运行时程序集引用错误:
Could not load file or assembly 'System.Xml.Linq, Version 4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The file cannot be accessed by the system. (Exception from HRESULT: 0x80070780)
Run Code Online (Sandbox Code Playgroud)
我运行了融合日志,有趣的是,这个程序集似乎加载了两次,一次加载版本4.0.0.0,然后加载版本3.5.0.0加载Newtonsoft.Json版本6.0.8.第一个加载工作,第二个是绑定错误的来源.
以下是成功4.0.0.0绑定的Fusion日志:
<meta http-equiv="Content-Type" content="charset=unicode-1-1-utf-8"><!-- saved from url=(0015)assemblybinder: --><html><pre>
*** Assembly Binder Log Entry (1/16/2017 @ 12:40:06 PM) ***
The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable C:\Users\<user>\AppData\Local\Apps\MyApplicationPath\MyApplication.exe
--- A detailed error log follows.
=== Pre-bind …
Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×4
assembly ×2
x86-64 ×2
asp.net ×1
c ×1
cpu ×1
dependencies ×1
disassembly ×1
eip ×1
executable ×1
gdb ×1
hardware ×1
linux ×1
msbuild ×1
power-saving ×1
reflection ×1
system.xml ×1
windows-10 ×1
x86 ×1
xamarin ×1