CSC:错误 CS7038:发射模块失败

CSC : error CS7038: Failed to emit module

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

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

但是我的解决方案在 Visual Studio 2013 年构建良好。

它是一个 ASP.NET webforms 项目 .NET 4.0

有人吗?

更新: 看来问题与 Red Gate Smart Assembly 结合具有默认值的方法参数有关。

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

遇到同样的错误(全新安装 VS2015 Enterprise,ASP.NET webforms 项目 .NET 4.0)。

经过一些调查,我发现引用中有两个 DLL 导致了这个问题。两者都是 .Net 2.0 程序集,并且都被 Red Gate Smart Assembly 6.5 混淆了。而真正的原因是... 混淆.

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

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

祝你好运!

编辑:将 Smart Assembly 更新到版本 6.9 解决了一个问题。

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

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

以前版本的编译器通过将无效值视为 nulldefault(T) 来处理这种情况。我们将修复 Roslyn 以使其具有相同的行为。

还有另一个错误可能会导致此错误:

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

要查看运行中的错误,您只需 运行 这段代码:

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

    return x.First();
}

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

更新:
如果有人感兴趣,现在 GitHub 上有一个 issue

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

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

Dim model as Integer = 2

然后使用:

Const N As Integer = model

你会抛出异常。

然而,当我将其修改为:

Dim N As Integer = model

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

原始片段:

    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)

扩展@jony-adamit的答案:

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

在 .NET 4.5 编译器(C# 编译器版本 12.0 或更早版本)中,您会收到此消息:

Compilation error (line 16, col 7): The type or namespace name 'Select' does not exist in the namespace 'Tools.Weapons' (are you missing an assembly reference?)

在 Roslyn 1.0.0 和 1.1.0 编译器版本中,您收到此消息:

Compilation error (line 1, col 1): Failed to emit module 'MyAssembly'.


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

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'。” 我意识到错误代码不一样,但它也是"failed to emit" 类型问题所以我想我会分享我的答案。

问题: 我的问题是我有一个 常量 的字符串,但我试图向它附加另一个字符串,像这样(使用 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

我遇到与此代码相同的 "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)

我在处理数据时遇到此错误 table 并且没有提供所需的数据类型:

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
  • 命名空间问题, also has open Github issue Here
  • 在我的例子中问题是这个,字段是strongly-typed,没有指定它,
  • 使用 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 不被发射,

将前 2 行更改为

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

错误消失了。 这应该是一个编译错误。 一个 CONST 显然不能依赖于一个变量,它可能......,嗯......,变化。 :-)

我刚刚 "Failed to emit module"。我错误地将空括号放在对通用扩展方法的调用中,仅当在三元运算符内时,如下所示:

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

(在三元运算之外,我只收到常规错误 CS7003:意外使用未绑定的通用名称。)

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

这段代码给出了错误:

example.GetValue<>(foo);

更正只是指定类型:

example.GetValue<string>(foo);

我不确定错误示例是否是有效语法:如果不是,我会预料到语法错误而不是这个错误,并且 Intellisense 接受了语法。

我在对实体使用 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. 编译器不知道要发出什么 IL,或者
  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,一切正常。

添加到可能原因列表中,在带有 C# 8 的 VS2019 中,我在执行类似以下操作时收到 "Failed to emit module" 消息:

_ = someBool ? SomeVoid() : default;

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