CSC:错误CS7038:无法发出模块

时间:2015-07-29 06:25:13

标签: c# .net visual-studio visual-studio-2015 roslyn

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

  

" CSC:错误CS7038:无法发出模块"。

但是我的解决方案在Visual Studio 2013中正常运行。

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

任何?

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

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

19 个答案:

答案 0 :(得分:12)

Original Snippet:

    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)

To This:

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

答案 1 :(得分:7)

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

经过一番调查后,我发现引用中有两个DLL导致这种情况。两者都是.Net 2.0程序集,它们都被 Red Gate Smart Assembly 6.5 混淆了。真正的原因是...... 混淆

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

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

祝你好运!

编辑:将智能装配更新到版本6.9修复了一个问题。

答案 2 :(得分:6)

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

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

以前版本的编译器通过将无效值视为nulldefault(T)来处理此方案。我们将修复Roslyn以获得相同的行为。

答案 3 :(得分:5)

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

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

Dim model as Integer = 2

然后使用:

Const N As Integer = model

你会抛出异常。

然而,当我将其修改为:

Dim N As Integer = model

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

答案 4 :(得分:3)

扩展@ jony-adamit的答案

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

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

  

编译错误(第16行,第7行):类型或命名空间名称   命名空间“Tools.Weapons”中不存在“选择”(是吗?   缺少装配参考?)

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

  

编译错误(第1行,第1列):无法发出模块   '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不理解如何解释它。

答案 5 :(得分:3)

我收到了类似的错误:“ 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

答案 6 :(得分:3)

我刚刚&#34;无法发出模块&#34;。我错误地将空括号放在对通用扩展方法的调用中,只有在三元运算符内部时才会这样:

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

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

答案 7 :(得分:1)

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

我发布了这个答案,总结了所提到的解决方案并帮助其他人,以便他们能够快速解决此错误

请仔细阅读本页的所有答案,我相信您可以使用上述解决方案解决问题,祝您好运:)

答案 8 :(得分:1)

使用通用方法时出现此错误但未包含类型。

此代码给出了错误:

example.GetValue<>(foo);

更正只是指定类型:

example.GetValue<string>(foo);

我不确定错误示例是否是有效的语法:如果不是这个错误,我本来期望语法错误,并且Intellisense接受语法。

答案 9 :(得分:1)

这个答案与@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显然不能依赖于变量,这可能......,......,变化。 : - )

答案 10 :(得分:1)

我在使用数据表时遇到此错误,并且未提供所需数据类型:

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

给它一个正确的数据类型摆脱了错误。我还必须将其转换为字符串才能正确比较它 -

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

答案 11 :(得分:1)

我使用此代码得到相同的“无法发出模块”错误,但将“Const”更改为“Dim”可以解决问题:

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

答案 12 :(得分:1)

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

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

要查看操作中的错误,您只需运行以下代码:

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

    return x.First();
}

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

<强>更新
如果有人感兴趣的话,GitHub现在有一个issue

答案 13 :(得分:0)

使用linq实体时出现此错误,我的linq查询在join子句中出现语法错误

答案 14 :(得分:0)

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

答案 15 :(得分:0)

我也在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 = ""

答案 16 :(得分:0)

原因: 当我们的代码中有些奇怪的东西时,似乎会引入此错误。 对我来说,在使当前用户成为身份时我犯了一个错误。

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

固定代码: 请在GetUserID <---------->()之后指定数据类型;在这种情况下,我已经指定了int。

注意 请尝试逐步撤消您的代码,以便您可以找到此问题。但是否则我很难跟踪该错误。

谢谢

答案 17 :(得分:0)

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

  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,则一切正常。

答案 18 :(得分:0)

添加到可能的原因列表中,在使用C#8的VS2019中,执行以下操作时,我收到“无法发出模块”消息:

_ = someBool ? SomeVoid() : default;

我在此处提交了有关此问题的错误报告:https://github.com/dotnet/roslyn/issues/41741