标签: .net-assembly

C#动态编译和"Microsoft.CSharp.dll"错误

我正在做的例子可以在这里找到.所以我试图在C#脚本中运行IronPython:

蟒蛇:

def hello(name):
    print "Hello " + name + "! Welcome to IronPython!"
    return

def add(x, y):
    print "%i + %i = %i" % (x, y, (x + y))
    return

def multiply(x, y):
    print "%i * %i = %i" % (x, y, (x * y))
    return
Run Code Online (Sandbox Code Playgroud)

C#:

using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting.Hosting;
using System;

namespace IntroIronPython
{
    class IronPythonMain
    {
        static void Main(string[] args)
        {
            // Create a new ScriptRuntime for IronPython
            Console.WriteLine("Loading IronPython Runtime...");
            ScriptRuntime …
Run Code Online (Sandbox Code Playgroud)

c# ironpython dynamic .net-assembly

6
推荐指数
2
解决办法
9261
查看次数

设置Log4Net以记录类库的输出

我正在尝试设置Log4Net(这是我第一次使用Log4Net)来记录程序集中的文本文件.我没有收到任何错误,但它也无法正常工作.我可以断开我记录输出的行,看到它们已到达,但我说没有任何反应.

我哪里错了?

packages.config<packages>属性中添加了以下内容到我的文件中:

  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
      <file value="c:\CTI\log.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO" />
        <levelMax value="FATAL" />
      </filter>
    </appender>

    <root>
      <level value="DEBUG"/>
      <appender-ref ref="FileAppender"/>
    </root>
  </log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我已将以下行添加到AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(Watch=true)]
Run Code Online (Sandbox Code Playgroud)

我使用NuGet添加了Log4Net程序集,我记录如下:

private log4net.ILog _Log;
_Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
_Log.Debug("FooBar");
Run Code Online (Sandbox Code Playgroud)

就像我说的,没有错误,但也没有任何反应.

我错过了什么?

c# log4net .net-assembly

6
推荐指数
1
解决办法
5465
查看次数

如何确定程序集的构建方式

我正在使用VS2010/2012,我想知道是否有办法(可能使用反射)来查看程序集的构建方式.

当我在Debug中运行时,我使用将#if DEBUG调试信息写入控制台.

但是,当你最终得到一堆程序集时,有没有办法看看它们是如何构建的?获取版本号很简单,但我无法找到如何检查构建类型.

c# build visual-studio-2010 .net-assembly visual-studio-2012

6
推荐指数
1
解决办法
393
查看次数

.DLL库程序集的.config文件的目的是什么?

这个问题是由我刚刚处理的另一个问题引发的.有一个托管库MyAssembly.dll,面向.NET 4.0.它有自己的MyAssembly.dll.config文件和一些<bindingRedirect>说明.我相信该.config文件是由compliler或NuGet包管理器生成的,因为我没有手动创建它.

问题是,当DLL被客户端应用程序加载时,会忽略绑定指令(RegAsm.exe在我的情况下,我也使用简单的控制台.NET应用程序验证了这一点).我不得不将它们从DLL的.config文件移动到客户端EXE应用程序的.config文件中,由.NET运行时获取并正确解析.

问题:托管库程序集(.DLL)的.config文件的目的是什么?它是否以任何方式参与加载库程序集的过程?

.net c# config .net-assembly

6
推荐指数
1
解决办法
648
查看次数

在T4模板中加载NuGet程序集

我需要引用包含我的Visual Studio T4模板的项目引用的其中一个程序集中的Type.但是,引用的程序集是从NuGet包安装的.随着Nuget引用的发展,NuGet将其放入我的解决方案的packages文件夹中的路径也将如此.例如,假设我的NuGet包是:

  • Facade.Contract.1.0.1-α

那么从我的项目到它的相对路径是:

  • .. \包\ Facade.Contract.1.0.1-α\ LIB\NET4\Facade.Contract.dll

如果预发行版更新为测试版,则该路径将更改.当包被释放时,路径将改变.每次路径更改时,我的*.tt文件中的装配线都已过时:

  • <#@ assembly name ="..\packages\Facade.Contract.1.0.1-alpha\lib \net4\Facade.Contract.dll"#>

我认为没有办法直接用汇编指令完成这个任务; 但是,我对一些疯狂的想法持开放态度.我可以将程序集自己加载到当前,或者是从属或仅反射的AppDomain吗?

我想我可以,但我不确定如何使用T4逻辑动态发现项目引用中引用程序集的路径.

有任何想法吗?

t4 .net-assembly nuget

6
推荐指数
1
解决办法
3063
查看次数

从相对路径加载c#中的dll

我在运行时加载一个dll,如下所示:

var DLL = Assembly.LoadFile(@"..\..\BuildDLLs\myDLL.dll");
Run Code Online (Sandbox Code Playgroud)

我收到一个要求绝对路径的ArgumentException.

我不想使用绝对路径,我想使用相对路径.

我怎样才能做到这一点?

c# dll .net-assembly

6
推荐指数
1
解决办法
4864
查看次数

动态编译代码时出现IOException

我有以下代码行:

CSharpCodeProvider c = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;
CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString());
Run Code Online (Sandbox Code Playgroud)

这会导致IOException被抛出.

附加信息:进程无法访问文件'C:\ Users\Username\AppData\Local\Temp\_dgl5fb1i.err',因为它正由另一个进程使用.

但是,这是耗费超过8GB RAM的大型程序的一部分.在具有16GB RAM的系统上,不会抛出此异常.动态编译的代码编译好并运行.程序在具有足够RAM的系统上运行时没有任何错误.该程序是为x64编译的.请注意,我没有得到OutOfMemoryException或任何迹象表明程序内存不足.在任务管理器中,内存使用率几乎在IOException抛出之前达到顶部.

什么可能导致这种行为,任何人都可以提出解决方案?

编辑

我修改了应用程序以使用更少的内存.即使应用程序有足够的可用内存,错误仍然存​​在.问题仍然只发生在一台机器上.

这可能与以下帖子有关:阻止CompileAssemblyFromSource生成具有重复文件名的临时文件.

c# reflection memory-management ioexception .net-assembly

6
推荐指数
1
解决办法
168
查看次数

无法在服务器上加载文件或程序集错误

我将代码部署到ST服务器时出现以下错误.相同的代码在我的机器和开发服务器上工作正常,但是当我们尝试访问应用程序中的一个页面时,在ST服务器上通过此错误.

错误是:

无法加载文件或程序集"Microsoft.Owin,Version = 2.1.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(来自HRESULT的异常:0x80131040)描述:在执行当前Web请求期间发生了未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.IO.FileLoadException:无法加载文件或程序集"Microsoft.Owin,Version = 2.1.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

这是我在web.config中的内容

<dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

c# .net-assembly visual-studio

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

如何将Roslyn脚本提交用作其他Roslyn编译中的程序集

我想在另一个非脚本编写的Roslyn编译中重用一个脚本作为动态程序集,但我不能为我的生活弄清楚如何使其工作.

例如,假设我以正常方式创建脚本,然后使用以下内容将脚本作为程序集发送到字节流:

var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = script.GetCompilation().WithOptions(compilationOptions);
using (var ms = new MemoryStream())
{
    EmitResult result = compilation.Emit(ms);
    ms.Seek(0, SeekOrigin.Begin);
    assembly = Assembly.Load(ms.ToArray());
}
Run Code Online (Sandbox Code Playgroud)

现在,假设我想将该程序集作为参考提供给另一个非脚本编译.我不能只使用,assembly因为没有一种MetadataReference.CreateFrom...()方法支持传递实际的Assembly实例.作为动态组件,它没有位置,所以我无法使用MetadataReference.CreateFromFile().

在过去,我已经MetadataReference.CreateFromStream()成功地使用了这种类型的东西,但是当程序集代表脚本提交时,这似乎不起作用(我不知道为什么).编译继续进行,但只要您尝试使用提交中的类型,就会出现以下错误:

System.InvalidCastException: [A]Foo cannot be cast to [B]Foo. Type A originates from 'R*19cecf20-a48e-4a31-9b65-4c0163eba857#1-0, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadNeither' in a byte array. Type B originates from 'R*19cecf20-a48e-4a31-9b65-4c0163eba857#1-0, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadNeither' in a byte array.
Run Code Online (Sandbox Code Playgroud)

我猜测它与提交程序集处于不同的上下文时有关,当评估与作为字节数组加载时.我非常喜欢在以后的非脚本编译中使用脚本提交中定义的对象和方法的最佳方法的任何见解或指导. …

.net c# .net-assembly roslyn

6
推荐指数
1
解决办法
1659
查看次数

如何在asp.net核心中更改汇编信息?

我想版本化我的asp.net核心应用程序.

我按照以下链接:http://www.matthiaseinig.de/2013/05/20/auto-generate-fileversion-for-all-projects-in-a-solution-with-t4/,但我想删除项目装配信息,但我没有找到它.

如何删除重复的程序集信息?我想用另一个文件覆盖asp核心程序集.

在此输入图像描述 在此输入图像描述 在此输入图像描述

更好的解决方案

过了一会儿,我意识到最好的解决方案是使用T4文件,每次构建后版本会自动递增.

看这里:

http://www.matthiaseinig.de/2013/05/20/auto-generate-fileversion-for-all-projects-in-a-solution-with-t4/

auto-versioning assembly-attributes .net-assembly .net-core asp.net-core

6
推荐指数
1
解决办法
3626
查看次数