我最近买了Ayende的书,在Boo中构建DSLs(买它,读它,它真棒)但是我遇到了一个实现问题,我想看看生成的代码是什么样的.我通常会使用反射器来查看代码,但在这种情况下,程序集是动态的,只在内存中.有没有办法将动态程序集保存到磁盘,以便我可以反映它们?
编辑/我的答案:
哇,花了一段时间才回到这个.不幸的是,我从原来的问题中留下了一点重要的一点.
重要的一点:我正在使用Ayende的RhinoDSL库,正如他在书中所建议的那样.我可以访问我的DslEngine子类中的boo编译器,如下所示:
public class JobEngine : DslEngine
{
protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
{
pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
}
}
Run Code Online (Sandbox Code Playgroud)
要改变最少并获得我想要的东西我需要添加一行...
public class JobEngine : DslEngine
{
protected override void CustomizeCompiler(Boo.Lang.Compiler.BooCompiler compiler, Boo.Lang.Compiler.CompilerPipeline pipeline, string[] urls)
{
compiler.Parameters.GenerateInMemory = false; // <--- This one.
pipeline.Insert(1, new ImplicitBaseClassCompilerStep(typeof (JobBase), "Prepare", "JobLanguage", "log4net", "Quartz"));
}
}
Run Code Online (Sandbox Code Playgroud)
这导致编译器将程序集输出到我的〜\ LocalSettings\Temp目录,然后我可以反映它.重要的是要注意,进行该更改会导致程序的其余部分中断(RhinoDSL无法再在内存中找到程序集,因为我将它们输出到磁盘),因此这仅用作调试工具.
我想知道在创建要包含在与依赖关系相关的其他项目中的库的版本时是什么启发式,以及我是否应该包含它们.
我的问题如下:
我有一个CommonUtilities库,它提供了一组可以在多个地方使用的实用程序.CommonUtilities的依赖包括log4net.dll(日志框架)和Oracle.DataAccess.dll(数据库驱动程序).
我有另一个名为MyProject的项目,我希望将CommonUtilities包含在内.MyProject还依赖于Oracle.DataAccess.
如果我使用ILMerge并将CommonUtilities合并到单个程序集CommonUtilities.dll中并引用来自MyProject的所有内容进行编译,但我确信我应该从MyProject明确引用Oracle.DataAccess,因为它是依赖项而不是使用合并到CU的程序集.添加对Oracle.DataAccess的引用也会导致使用不明确的语句,因为引用了两个Oracle.DataAccess程序集.
在我的情况下使用ILMerge/Internalize会导致编译错误,因为内部化Oracle.DataAccess程序集中的类型是从CommonUtilities返回的,因为它们被标记为内部MyProject无法识别返回的类型.
使这项工作的唯一方法就是不将这个特定的程序集(Oracle.DataAccess)合并到CommonUtilities中,而只是从MyProject引用它.这反过来又会产生一个新问题:我应该引用哪个Oracle.DataAccess.dll - 与CommonUtils一起分发的依赖关系?
还有其他方法可以解决这一切吗?
我们将在每个库中的Assembly.cs中找到Assembly版本.
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Run Code Online (Sandbox Code Playgroud)
我的问题是这是什么1.0.0.0意思?
谢谢
可能重复:
确定程序集(CLR)版本的程序集
我有一个在.NET Framework中编译的库/ DLL文件.
现在(没有任何编码)我想检查用于编译此库的.NET Framework版本.我需要知道它是2.0,3.5还是4.0.有没有任何工具可以帮助我实现这一目标?(我知道它应该在Framework 4.0的版本下编译,但我需要100%确定使用了Framework的4.0版本).
我正在开发一个引用其他产品的dll的项目.该产品每年都有一个版本,每个版本的版本都会发生变化,但方法保持不变.当我为2010年运行我的项目构建时,当我尝试在2009年运行它时,它会抛出一个错误,因为它依赖于不同的版本.有没有解决的办法?
我有一个包含两个项目(一个Web解决方案一和乙)与乙引用一个.
在A中我有一个Html显然可以从A或B调用的扩展方法.
我的问题是,一旦调用该方法(通常是从局部视图),方法内部是否有一种方法可以确定调用是来自程序集A还是程序集B而不传递任何内容?
我试着看看我能做什么HttpContext.Current.Request但找不到任何有用的东西.我可以获取URI,但仍然没有告诉我发起请求的文件位于哪个程序集中.
谢谢你的答案 - 该方法返回一个字符串,字符串来自string.resx文件,我有一个每个程序集.这就是为什么我需要知道要访问哪个文件以返回字符串.由于每个程序集在启动时"注册"自己,如果我添加一个新程序集,我的方法不会改变,因为它只会查找程序集.实际上我的整个项目不会改变.我之前没有引入另一个参数的原因是b/c它将意味着大量的变化,老实说我没有看到好处.虽然我看到你的观点并且我普遍同意它,但我认为在我的情况下,并不是该方法返回不同的东西,它只是根据程序集获取正确的资源文件.
我注意到我不仅可以在DLL中添加引用,还可以在Visual Studio中添加EXE,并访问EXE中的所有类,如果它是DLL的话.
是否有任何理由创建DLL或我是否也可以引用EXE?
我问的是因为我经常编写我在Windows和Mac OS下运行的.net程序,我通常的解决方案是创建一个具有该功能的DLL,然后是两个GUI,每个目标一个.
但是,在我看来好像我只能编写我的应用程序的Windows版本,然后将该Windows版本(EXE文件)添加到我的Mac项目并引用Windows EXE而不是DLL.它还有一个额外的好处,我可以从Mac文件夹运行Windows版本而无需添加其他文件.
有没有什么好的理由不这样做?
我有一个在开发环境中引用此程序集的应用程序:
name="Microsoft.Data.SqlXml" culture="neutral" publicKeyToken="89845dcd8080cc91" version="9.0.242.0"
Run Code Online (Sandbox Code Playgroud)
但是,实时服务器包含此库的旧版本:
name="Microsoft.Data.SqlXml" culture="neutral" publicKeyToken="b77a5c561934e089" version="3.2.2917.0"
Run Code Online (Sandbox Code Playgroud)
如您所见,publicKeyToken与众不同.我已将bindingRedirect添加到app.config:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Data.SqlXml" culture="neutral" publicKeyToken="89845dcd8080cc91" />
<bindingRedirect oldVersion="9.0.242.0" newVersion="3.2.2917.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)
但我仍然得到错误:
未处理的异常:System.IO.FileNotFoundException:无法加载文件或ass embly'Microsoft.Data.SqlXml,Version = 3.2.2917.0,Culture = neutral,PublicKeyToke n = 89845dcd8080cc91'或其依赖项之一.该系统找不到指定的文件.文件名:'Microsoft.Data.SqlXml,Version = 3.2.2917.0,Culture = neutral,PublicKe yToken = 89845dcd8080cc91'---> System.IO.FileNotFoundException:无法加载文件或程序集'Microsoft.Data.SqlXml,Version = 9.0.242.0,Culture = neutral,Publi cKeyToken = 89845dcd8080cc91'或其依赖项之一.该系统找不到指定的文件.文件名:'Microsoft.Data.SqlXml,Version = 9.0.242.0,Culture = neutral,PublicKey Token = 89845dcd8080cc91'
在这种情况下,有没有办法重定向到旧版本的库?
我一直在寻找可能的解决方案,但似乎无法找到答案.我的问题是我有一些类需要完全隐藏在Assembly.getTypes中,因为我正在为一个应用程序编写一个插件,它正在拾取我需要保持隐藏的类型(即使它们被声明为私人或内部课程).
任何人都知道如何改变assembly.GetTyes返回什么,或者一个aficionado属性,以防止这些类型被列出?
assemblies ×10
.net ×7
c# ×5
asp.net ×2
dll ×2
asp.net-mvc ×1
assemblyinfo ×1
boo ×1
dynamic ×1
exe ×1
hidden ×1
httprequest ×1
ilmerge ×1
libraries ×1
localization ×1
reflection ×1
version ×1