我正在使用Costura.Fody将所有dll嵌入到我的应用程序集中.
有没有办法在Debug构建模式下禁用Costura.Fody?如何使Costura.Fody仅在Release或自定义构建配置中工作?
我想问一下是否可以使用Fody- Costura,它将依赖关系嵌入到可执行文件和Obfuscar中,用于混淆.
目前我正在努力,因为在Visual Studio 2017中Costura的msbuild目标在obfuscar之前执行(然后抱怨缺少依赖文件).
由于obfuscar本身不提供目标,我使用的是MSBuild.Obfuscar.
有没有办法将这两者结合起来,可能是通过指定目标的顺序?
首先:我是一个完全的初学者.我在一个解决方案中有两个项目.一个项目是一个控制台应用程序,它从Windows窗体应用程序调用.现在我想将这些添加到一个可执行文件中.我被告知有可能与Fody/Costura合作.我下载了它并将IncludeAssemblies代码添加到xml文件中.但是,如果我去调试文件夹,那么它们仍然是两个可执行文件(除了一些新生成的文件)可执行文件保存在另一个地方还是我做错了什么?
在尝试首先使用ILMerge和Fody/Costura嵌入我的项目依赖项后,我遇到了同样的问题.
标题栏高度似乎缩小了.VS2015调试二进制和发布二进制文件(没有嵌入依赖项)具有适当的高度和填充(如屏幕截图所示).遗憾的是,包含图标并不能解决问题.我是否必须在Costura XML中包含其他内容?
我错过了什么?
.NET Framework 4.6
编辑:
显然我的问题是由于使用FixedDialog作为FormBorderStyle.使用任何固定样式,嵌入依赖项后填充将消失.但它与Sizeable(默认)一样完美地用作FormBorderStyle.
在尝试构建项目时,我突然遇到异常.似乎与Mono.Cecil有一些东西.但我没有在我的项目中使用Mono.
Fehler 13 Fody:发生了未处理的异常:Exception:Die Datei oder Assembly"Mono.Cecil,Version = 0.9.6.0,Culture = neutral,PublicKeyToken = 0738eb9f132ed756"odereineAbhängigkeitdavonwurde nicht gefunden.Die gefundene Manifestdefinition der Assembly stimmt nicht mit demAssemblyverweisüberein.(Ausnahme von HRESULT:0x80131040)StackTrace:bei System.Signature.GetSignature(Void*pCorSig,Int32 cCorSig,RuntimeFieldHandleInternal fieldHandle,IRuntimeMethodInfo methodHandle,RuntimeType declaringType)bei System.Reflection.RuntimeMethodInfo.FetchNonReturnParameters()bei System.Reflection.RuntimeMethodInfo.GetParametersNoCopy ()bei System.Reflection.RuntimePropertyInfo.GetIndexParametersNoCopy()
bei System.Reflection.RuntimePropertyInfo.GetIndexParameters()bei System.RuntimeType.GetPropertyCandidates(String name,BindingFlags bindingAttr,Type [] types,Boolean allowPrefixLookup)bei System.RuntimeType.GetPropertyImpl(String name,BindingFlags bindingAttr,Binder binder,Type returnType,类型[]类型,ParameterModifier []修饰符)bei System.Type.GetProperty(String name,BindingFlags bindingAttr,Binder binder,Type returnType,Type [] types,ParameterModifier [] modifiers)bei PropertyDelegateBuilder.BuildPropertySetDelegate [T](Type type,字符串propertyName)在c:\ TeamCity\buildAgent\work\7495521761d392b9\FodyIsolated\DelegateBuilders\PropertyDelegateBuilder.cs:Zeile 9. bei DelegateBuilder.BuildDelegateHolder(Type weaverType)in c:\ TeamCity\buildAgent\work\7495521761d392b9\FodyIsolated\DelegateBuilders\DelegateBuilder.cs:Zeile 25. bei DelegateBuilder.GetDelegateHolderFromCache(Type weaverType)in c:\ TeamCity\buildAgent\work\7495521761d392b9\FodyIsolated\DelegateBuilders\DelegateBuilder.cs:Zeile 16 .bei InnerWeaver.InitialiseWeavers(List`1 weaverInstances)在c:\ TeamCity\buildAgent\work\7495521761d392b9\FodyIsolated\InnerWeaver.cs:Zeile 65. bei …
我已经编写了一个小exe,LibGit2Sharp并且正在尝试使用Costura.Fody它嵌入所有内容,因此我只有一个exe可以分发(实际上,也有两个配置文件,但这没关系)。
问题似乎是对,LibGet2Sharp.dll有相当牢固的引用git2-1196807.dll,我似乎无法弄清楚如何以前者可以使用的方式嵌入后者。我已经尝试了几件事,但是我认为我最好的尝试是:
所有这些.dll packages文件都从解决方案的文件夹中复制并设置为Build Action = Embedded Resource和Copy to Output Directory = Do Not Copy。
LibGit2Sharp参考设置为Copy Local = false,我已经尝试了FodyWeavers.xml中的简单路由:
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura>
</Costura>
</Weavers>
Run Code Online (Sandbox Code Playgroud)
更复杂的是:
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura>
<Unmanaged64Assemblies>
Costura64\LibGit2Sharp
Costura64\git2-1196807
</Unmanaged64Assemblies>
<Unmanaged32Assemblies>
Costura32\LibGit2Sharp
Costura32\git2-1196807
</Unmanaged32Assemblies>
</Costura>
</Weavers>
Run Code Online (Sandbox Code Playgroud)
但是,我总是得到一个错误,不是在打开exe时,而是在我单击首先使用git库的按钮时:
...'LibGit2Sharp.Core.NativeMethods'引发了异常。---> System.DllNotFoundException:无法加载DLL'git2-1196807':找不到指定的模块。(来自HRESULT的异常:0x8007007E)...
我所做的一些事情使我看到LibGet2Sharpdll无法访问的错误(不是有关的错误git2-1196807),但是我认为这只是在削弱Fody的时候。
您可以提供任何建议,我将不胜感激。这让我感到困惑。如果将git2-1196807.dll文件放在部署的位置“。\ lib \ win32 \ x86”和等效的64位文件中,则该文件可以正常运行,但是无法使用costura.fody。
有什么想法吗?
这个问题更多的是关于C#而不是关于log4net(我认为).
我创建了一个自定义appender,让它读取程序先前设置的静态字段.
令我惊讶的是,静态字段被重新初始化,并且设定值不会使其成为追加者.
我启动了debugview,发现静态构造函数被调用了两次(!).这应该在同一个appdomain中不可能吗?只有debugview才能解决这个问题,因为VS没有在断点上第二次命中.
请注意,这不是关于避免使用log4net的静态变量的问题.我对log4net使用什么样的魔法来实现这个目标感兴趣?
编辑#1
你好约翰,大粉丝.
我按照要求进一步隔离了它.首先,我开始空白并努力解决暴露错误的目标情况.由于我几乎匹配了目标角色,但仍然没有重复,我反过来了.
从错误情况开始,我删除了所有我认为不重要的东西,直到它开始......按预期工作.
当运行时试图解析log4net程序集时,似乎有一些奇怪的事情(如在调试模式中观察到的那样)
这是我在debugview中看到的:
[7756]一般:WARN - 无法解析模块的'log4net'版本.异常:System.NullReferenceException:未将对象引用设置为对象的实例.[7756]在DebuggerShared.Services.EventArgs.ModuleLoadedInDebuggerEventArgs..ctor(String modulePath,String moduleLoadMessage,Boolean isUserCode,String name,String version)[7756]一般:WARN - 无法解析模块的"FollowUp.Common"版本.异常:System.NullReferenceException:未将对象引用设置为对象的实例.[7756]在DebuggerShared.Services.EventArgs.ModuleLoadedInDebuggerEventArgs..ctor(String modulePath,String moduleLoadMessage,Boolean isUserCode,String name,String version)
并且VS在调试模块屏幕中没有显示路径的值.现在我是如何设法达到这种状况的?很奇怪,它设法加载程序集,但不能告诉从哪里:)
这是一个孤立的情况,如果我进一步修改它开始按预期工作.
https://www.sugarsync.com/pf/D6486369_1701716_00940
我仍然对技术细节感兴趣,但在删除对log4net的引用并再次添加它之后,它们都开始重新运行了.我很高兴它有效,但它让我觉得我没有彻底的解释
此外,静态构造函数*现在被调用两次,这是有意义的,因为当log4net得到它时,类型再次初始化.
我认为花费更多时间在这个原因上是不值得的,我认为解决方案处于一种奇怪的状态并且理解所有这些都具有边际价值.不过,如果你能想到解释这个的话,我会很高兴来到这里.
编辑#2
事实证明,有些程序集确实被加载了两次,包括一个带有静态构造函数的程序集.我稍后会调查这是如何实现的,但我通过禁用和启用Costura来解决这个问题.Costura是一个msbuild任务,它将所有程序集合并为一个.我不是说Costura是根本原因.可能很容易就是csproj/sln文件处于奇怪的状态.
考虑如何在未来更快地诊断此问题,我启动了sysinternals ProcessExplorer.现在我希望看到程序集只被加载一次,但我发现它们被加载了两次.似乎这是仅在.NET 4中修复的运行时中的错误
http://forum.sysinternals.com/why-some-net-assemblies-are-duplicated-in-memory_topic15279.html https://connect.microsoft.com/VisualStudio/feedback/details/467560/clr-maps-assemblies -INTO最虚拟地址空间的两倍
编辑#3 Costura使装配加载两次.项目所有者在同一天修复了该问题:) http://code.google.com/p/costura/issues/detail?id=17&thanks=17&ts=1328826304
我们需要一个Costura标签,但我没有必要的1500点声望点.如果您拥有这些权利,请创建它.谢谢.
亲切的问候,汤姆
这个问题与我自己的案例有针对性,因为任何拥有本地化应用程序并且必须提供独立EXE的人都有这个问题 - 他们会想要使用ILMerge(或Costura或某些自制程序解决方案)来放置本地化DLL(或任何其他程序集)进入他们的EXE--但一旦他们这样做,他们就不能再调试他们的代码了.VS调试器将拒绝接受为原始EXE生成的原始PDB文件,可能是因为ILMerge步骤更新校验和或更改GUID.
我想知道的是,如果有任何解决方法...就像一些鲜为人知的ILMerge选项,也许吧?它让我感到非常普遍和不必要的调试能力.
我相信在本地化之后调试这样一个应用程序的唯一其他方法是维护一个使用DLL非ILMerged的并行构建选项,这很好,除非您碰巧想要调试本地化代码本身(例如,我).那你真的不走运.谁能想到其他选择?
我也尝试使用Costura,但由于本地化DLL都包含相同名称的资源(并且与主资源AppName.resource相同),因此您只能在引用中添加一个这样的DLL:不允许使用后续的DLL.有没有办法噱头Costura工作?(如果它可以工作,PDB问题可能不会发生,因为组合是视觉工作室构建的一部分..?)
编辑:我正在寻找导致PDB/EXE匹配的想法.我意识到你可以在十六进制编辑器中破解pdb.然而,问题特别询问了如何使系统按预期工作.
VisualStudio 2017,最新的 Fody nuget 包,WinForms,C#
当您安装https://github.com/Fody/Fody 时,它会FodyWeavers.xml在项目主目录中自动生成。
如何更改此文件的位置?
我尝试更改包含在项目设置<Content Include="Properties\FodyWeavers.xml" />和 Fody.targets 中的内容 <ProjectWeaverXml>$(ProjectDir)\Properties\FodyWeavers.xml</ProjectWeaverXml>。
但是在编译时我仍然收到以下错误:
错误 Fody:找不到织布工文件的路径。搜索“C:\Users\Thomas\Desktop\projects\FodyWeavers.xml”、“C:\Users\Thomas\Desktop\projects\fodytest\FodyWeavers.xml”。
fody-costura ×10
c# ×9
.net ×4
fody ×4
nuget ×2
assemblies ×1
dll ×1
exe ×1
ilmerge ×1
libgit2sharp ×1
localization ×1
log4net ×1
obfuscar ×1
winforms ×1