CS7038:发射模块失败

本文关键字:失败 模块 发射 CS7038 | 更新日期: 2023-09-27 18:05:28

安装Visual Studio 2015并构建我的项目后,我收到错误

"CSC: error CS7038: Failed to emit module"。

然而,我的解决方案是在Visual Studio 2013中构建良好。

它是一个ASP。.NET webforms project .NET 4.0

有人知道吗?

UPDATE:看起来问题与Red Gate Smart Assembly结合使用默认值的方法参数有关。

UPDATE: Smart Assembly 6.9为我修复了错误。

CS7038:发射模块失败

原始片段:

    private void radButton1_Click(object sender, EventArgs e)
    {
        string perp = radTextBox1.Text;
        int i = 0;
        DataRow arp = ale.Rows[i];
        while (i <= ale.Rows.Count)
        {
            if (ale.Rows[i].Field<>("FullName") = perp)
            {
                arp = ale.Rows[i];
                ale.Rows.Remove(arp);
            }
        }
        i = ale.Rows.Count;
        radLabel1.Text = i.ToString();
    }

改变:

    if (ale.Rows[i].Field<>("FullName") = perp)

:

    if (ale.Rows[i].Field<String>("FullName") == perp)

得到相同的错误(新安装的VS2015 Enterprise, ASP。.NET webforms project .NET 4.0).

经过一番调查,我发现引用中有两个dll导致了这个问题。两者都是。net 2.0程序集,它们都被Red Gate Smart Assembly 6.5混淆了。真正的原因是……困惑 .

幸运的是,这些程序集是我的,所以我尝试在不使用Smart Assembly的情况下构建它们-错误消失了。

有趣的是,在尝试构建项目之前,Visual Studio没有显示任何错误或警告。

祝你好运!

EDIT:将Smart Assembly更新到6.9版本修复了一个问题。

正如@Andrey报告的,这似乎是一个混淆的程序集的问题,这给Roslyn带来了一些困难。今天我能够得到这个错误的实时再现,根本原因似乎是混淆器无效/破坏了默认参数值存储在元数据中的方式。当运行ildasm时,默认值将显示为:

.param [3] /* Invalid default value for 0800001F: */

以前版本的编译器通过将无效值处理为nulldefault(T)来处理此场景。我们会让罗斯林有同样的行为。

我也在VB中抛出了这个异常。. NET (Visual Studio 2015 - Pro),并隔离了导致错误的一行。

在下面的代码行中,如果将model定义为整数,如:

Dim model as Integer = 2

,然后使用:

Const N As Integer = model

你将抛出异常。

然而,当我将其修改为:

Dim N As Integer = model

未抛出异常。Const语法是我快速添加模型的另一个程序的遗留代码,并且常量不能设置为预定义的整数类型。

我刚刚有"Failed to emit module"。我错误地在对泛型扩展方法的调用中放入了空括号,只有在三元操作符中才这样做,如下所示:

var a = b == 6 ? 8 : x.Foo<>();

(在三元操作之外,我只是得到常规错误CS7003:意外使用未绑定的泛型名称)

扩展@jony-adamit的答案:

我也有这个编译错误被抛出在c# (Visual Studio 2015)。这归结为。net 4.5和VS2015中的新编译器Roslyn在编译器输出上的差异。您可以使用下面的代码并自己运行它,或者使用dotnetfiddle (https://dotnetfiddle.net/fa2rMs)并在编译器之间切换。

在。net 4.5编译器(c#编译器版本12.0或更早)中,你会得到这样的消息:

编译错误(第16行,col 7):类型或命名空间名称"选择"在命名空间"工具"中不存在。你是武器吗缺少程序集引用?)

在Roslyn 1.0.0和1.1.0编译器版本中,你会得到这样的消息:

编译错误(第1行,col 1): Failed to emit moduleMyAssembly。


重现错误的代码(注意命名空间):

public class Program
{   
    public static void Main()
    {
        Tools.Delegater.Work();
    }
}
namespace Tools 
{
    public static class Delegater
    {   
        public static System.Action Work = () => 
        {
            var query = from x in Weapons
                        select x;
        };
    }
}
namespace Tools.Weapons
{
    public class Cannon { }
}

从编译器消息中可以看出,Roslyn的消息让您猜测编译器错误的内容和位置。根据应用程序的大小,缺乏细节可能需要几天或几周的时间才能发现根本原因。而上一个编译器中的消息则指向开始检查代码的确切位置。

另一个很大的区别是,之前的编译器会在这种情况下显示Visual Studio中的语法错误,但不幸的是Roslyn (atm)不会。然而,如果你知道去哪里看,并且你把鼠标悬停在linq to sql语句中的'x'变量上,那么你会发现Rosyln不知道如何解释它。

我得到一个类似的错误:"BC36970。发射模块"Something.dll"失败。"我意识到错误代码不一样,但它也是一个"未能发出"类型的问题,所以我想我会分享我的答案。

问题:我的问题是,我有一个字符串,这是一个常数,但我试图追加另一个字符串到它,像这样(使用VB代码):

Dim MyString1 As String = "Test1"
Const MyString2 As String = "Test2" & MyString1

解决方案:我只需将第二个字符串从Const转换为Dim,错误就消失了:

Dim MyString1 As String = "Test1"
Dim MyString2 As String = "Test2" & MyString1

我在使用泛型方法但未能包含类型时得到此错误。

这个代码给出了错误:

example.GetValue<>(foo);

只需指定类型:

example.GetValue<string>(foo);

我不确定错误的例子是否是有效的语法:如果不是,我会期望语法错误,而不是这个错误,智能感知接受语法。

还有一个bug会导致这个错误:

发生在我没有重构的情况下改变了属性名,这导致一些linq代码调用命名空间本身!

你所要做的就是运行这段代码:

public static int Test()
{
    var x = from c in ConsoleApplication5
        select 3;
    return x.First();
}

其中ConsoleApplication5是命名空间!
这只发生在VS2015中。

更新:
如果有人感兴趣的话,现在在GitHub上有一个问题。

当我正在使用数据表并且没有提供所需的数据类型时,我得到了这个错误:

bool temp = dtTab.AsEnumerable().Any(row => row.Field<>("active") == 1);

给它一个合适的数据类型可以消除错误。我还必须将其转换为字符串,以便能够正确地进行比较-

bool temp = dtTab.AsEnumerable().Any(row => row.Field<Boolean>("active").toString() == "1");

我也得到了这个错误,似乎有一些主要的原因导致这个错误。

我发布这个答案是为了总结上面提到的解决方案,并帮助其他人,这样他们就可以快速解决这个错误

  • 在标记答案中提到的Smart Assembly使用混淆dll解决方案:将Smart Assembly更新到6.9版本
  • 这里提到的命名空间问题,也有开放Github问题在这里
  • 在我的情况下,问题是这个,字段是强类型的,没有指定它,这里提到
  • 使用Const关键字,这里提到的

请仔细阅读本页的所有答案,我相信你可以使用提到的解决方案之一来解决问题,祝你好运:)

这个答案与@wrtsvkrfm

发布的答案相似
  'Dim NEWLINE As String = "<BR/>"
   Dim NEWLINE As String = vbCrLf
 Const HT_QTC_VENDOR As String = "<B>some stuff {0}</B>" & NEWLINE

这将导致DLL不被发出,

将前两行改为

  'Const NEWLINE As String = "<BR/>"
   Const NEWLINE As String = vbCrLf

,错误就会消失。这应该是一个编译错误。CONST显然不能依赖于变量,因为变量可能…,嗯……,有所不同。

我得到相同的"Failed to emit module"错误,但将"Const"更改为"Dim"解决了这个问题:

Dim userStatus1 As String = convAttrSet("user_status")
Dim userStatus2 As String = convAttrSet("user_status")
Const PENDING As Boolean = (userStatus1 = userStatus2)

当使用linq到实体时,我得到了这个错误,我的linq查询在连接子句

对于我来说,在添加更改assemblyinfo.cs (NetRevisionTool.exe)的构建后步骤后发生了这个问题。注意不要在构建和编辑并继续之间更改AssemblyInfo.cs。

我也在VB中抛出了这个异常。. NET (Visual Studio 2015 - Pro),并隔离了导致错误

的一行。
     Faulty....
    Dim i As Short
    Dim j As Short = BancoCombienElement(LaChaine)
    Const a  = (22 / 60) * j
    Dim TiTxt As String = ""
    Dim S_8_10_12_14 As String = ""
    Work good!!!!!!!!
    Dim i As Short
    Dim j As Short = BancoCombienElement(LaChaine)
    Dim a As Short = (22 / 60) * j
    Dim TiTxt As String = ""
    Dim S_8_10_12_14 As String = ""

原因:这个错误似乎是在我们的代码中有一些奇怪的东西时引入的。对于我来说,我犯了一个错误,而从身份获取当前用户。

错误代码:int currentUserId = User.Identity.GetUserId<>();

固定代码:

请在GetUserID<---------->()之后指定数据类型;在本例中,我指定了int.

注意请尝试逐步撤销您的代码,以便找到此问题。但除此之外,我很难跟踪这个错误。

谢谢

对于编译器未捕获的任何错误都可能发生这种情况。可能

  1. 编译器不知道输出什么,或者
  2. 它知道,但在实际执行的过程中,发生了意想不到的事情或
  3. 它发出的IL是无效的,并且一些比编译器本身更低级别的安全网会产生编译器无法处理的错误。

在任何情况下,出现CS7038是因为c#是有效的,并且编译器很有可能在这样一个意想不到的地方遇到错误,以至于它不再能够跟踪到您编写的任何源代码行。因此,人们在这里报告的看似随机的错误导致了这种情况。

我已经使用c#几十年了,现在我来到这里,因为这是我第一次遇到这样的错误。

在我的例子中,下面的代码生成错误。在项目文件中使用<LangVersion>Preview</LangVersion>,并在Visual Studio 2019预览中使用c# 8编译器。

void FailToEmitDll(ReadOnlySpan<char> span) {
  ReadOnlySpan<char> temp;
  temp = 1 switch
  {
    _ => span
  };
}

奇怪的是,如果你把声明和赋值改为var temp,一切都工作得很好。

添加到可能原因列表中,在VS2019中使用c# 8,我在做以下事情时得到了"未能发出模块"消息:

_ = someBool ? SomeVoid() : default;

我在这里提交了一个关于它的bug报告:https://github.com/dotnet/roslyn/issues/41741

当我在Mock对象中运行一个复杂的表达式时,我得到了这个错误,我通过将表达式结果存储到本地变量来解决这个问题。