Visual Studio 2015をインストールしてプロジェクトをビルドした後、エラーが発生する
「CSC:エラーCS7038:モジュールの出力に失敗しました」。
ただし、私のソリューションはVisual Studio 2013で正常に構築されています。
これは、ASP.NET Webフォームプロジェクト.NET 4.0です。
誰でも?
PDATE:問題は、デフォルト値を持つメソッドパラメータと組み合わせたRed Gate Smart Assemblyに関係しているようです。
更新: Smart Assembly 6.9では、エラーが修正されています。
同じエラーが発生しました(VS2015 Enterprise、ASP.NET webformsプロジェクト.NET 4.0の新規インストール)。
いくつかの調査の結果、これを引き起こす参照に2つのDLLがあることがわかりました。どちらも.Net 2.0アセンブリであり、どちらもRed Gate Smart Assembly 6.5によって難読化されています。そして本当の理由は... 難読化。
幸いにも、これらのアセンブリは私のものなので、スマートアセンブリを使用せずにそれらを構築しようとしました-エラーはなくなりました。
興味深いのは、プロジェクトをビルドする前にVisual Studioによってエラーや警告が表示されないことです。
幸運を!
[〜#〜] edit [〜#〜]:Smart Assemblyをバージョン6.9に更新すると、問題が修正されました。
元のスニペット:
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)
また、VB.NET(Visual Studio 2015-Pro)でこの例外がスローされ、エラーの原因となっている1行を分離しました。
以下のコード行で、model
を整数として定義すると、次のようになります。
Dim model as Integer = 2
次に使用します:
Const N As Integer = model
例外をスローします。
ただし、これを次のように変更した場合:
Dim N As Integer = model
例外はスローされませんでした。 Const構文は、モデルをすばやく追加した別のプログラムのレガシーコードであり、定数を事前定義された整数型に設定することはできません。
@Andreyが報告したように、これは難読化されたアセンブリの問題で、Roslynに問題を引き起こしているようです。今日、私はこのエラーのライブ再現を得ることができました。根本的な原因は、難読化ツールがデフォルトのパラメーター値がメタデータに格納される方法を無効化/破損しているようです。 ildasmを実行すると、デフォルト値は次のように表示されます。
_.param [3] /* Invalid default value for 0800001F: */
_
以前のバージョンのコンパイラは、無効な値をnull
またはdefault(T)
として扱うことにより、このシナリオを処理しました。同じ動作をするようにRoslynを修正します。
「モジュールの発行に失敗しました」というメッセージが表示されました。次のように、三項演算子の内部にある場合にのみ、ジェネリック拡張メソッドの呼び出しに誤って空の角かっこを入れました。
var a = b == 6 ? 8 : x.Foo<>();
(3項演算以外では、通常のエラーCS7003:バインドされていない総称名の予期しない使用が発生します。)
@ jony-adamitからの回答を拡張:
また、C#(Visual Studio 2015)でこのコンパイルエラーがスローされました。 .NET 4.5とVS2015の新しいコンパイラであるRoslynからのコンパイラ出力の違いが原因です。以下のコードを取得して自分で実行するか、dotnetfiddle( https://dotnetfiddle.net/fa2rMs )を使用してコンパイラを切り替えます。
.NET 4.5コンパイラ(C#コンパイラバージョン12.0以前)では、次のメッセージが表示されます。
コンパイルエラー(16行目、7行目):タイプまたは名前空間名「Select」が名前空間「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のメッセージは、コンパイラーエラーの何がどこにあるのかを推測させます。また、アプリケーションのサイズによっては、詳細の欠如が根本原因を発見するのに数日から数週間かかる場合があります。一方、前のコンパイラのメッセージは、コードのレビューを開始する正確な場所を示していました。
もう1つの大きな違いは、以前のコンパイラではこのシナリオのVisual Studioの構文エラーが表示されますが、Roslyn(atm)では表示されません。ただし、どこを見るかがわかっていて、linq to sqlステートメントの「x」変数の上にマウスを置いた場合、Rosylnがそれを解釈する方法を理解していないことがわかります。
ジェネリックメソッドを使用していて、タイプを含めることができない場合、このエラーが発生しました。
このコードはエラーを出しました:
example.GetValue<>(foo);
修正は単にタイプを指定することでした:
example.GetValue<string>(foo);
エラーの例が有効な構文であるかどうかはわかりません。構文エラーがこのエラーではなく、Intellisenseが構文を受け入れた場合、構文エラーが予想されます。
「BC36970。モジュール 'Something.dll'の発行に失敗しました。」エラーコードは同じではありませんが、 「放出に失敗した」タイプの問題でもあるので、私の答えを共有したいと思いました。
問題:私の問題は定数の文字列があったことですが、それに別の文字列を追加しようとしました(VBコードを使用) :
Dim MyString1 As String = "Test1"
Const MyString2 As String = "Test2" & MyString1
Solution: 2番目の文字列をConstからDimに変換するだけでエラーが消えました。
Dim MyString1 As String = "Test1"
Dim MyString2 As String = "Test2" & MyString1
データテーブルを使用していて、必要なデータタイプを指定しなかったときに、このエラーが発生しました。
bool temp = dtTab.AsEnumerable().Any(row => row.Field<>("active") == 1);
適切なデータ型を与えることでエラーを取り除きました。また、正しく比較できるように、文字列に変換する必要がありました。
bool temp = dtTab.AsEnumerable().Any(row => row.Field<Boolean>("active").toString() == "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は明らかに変数に依存できません。 :-)
私もこのエラーを受け取りました。このエラーの原因にはいくつかの主な理由があるようです。
私はこの回答を投稿して、言及された解決策をまとめ、他の人がこのエラーをすばやく解決できるように助けます
Const
キーワードを使用する ここに記載このページのすべての回答を注意深くお読みください。幸運なことに上記の解決策のいずれかを使用して問題を解決できると確信しています:)
この正確なエラーを引き起こす可能性のある別のバグがあります:
リファクタリングなしでプロパティ名を変更した後、いくつかのlinqコードがnamespace自体を呼び出した後に私に起こりました!
動作中のバグを確認するには、次のコードを実行するだけです。
public static int Test()
{
var x = from c in ConsoleApplication5
select 3;
return x.First();
}
ここでConsoleApplication5は名前空間です!
これはVS2015でのみ発生します。
更新:
誰かが興味があれば、GitHubに issue があります。
これは、コンパイラーがキャッチしなかったエラーで発生する可能性があります。多分
いずれの場合でも、C_が有効であり、コンパイラが予期しない場所でエラーを検出したため、記述したソースコード行までトレースできなくなったため、このCS7038
が発生します。したがって、これを引き起こすために人々がここで報告する一見ランダムなエラー。
私は何十年もC#を使用してきましたが、このようなエラーが発生するのは初めてなので、今ここに到着しました。
私の場合、次のコードでエラーが発生します。プロジェクトファイルで<LangVersion>Preview</LangVersion>
を使用し、Visual Studio 2019プレビューでC#8コンパイラを使用します。
void FailToEmitDll(ReadOnlySpan<char> span) {
ReadOnlySpan<char> temp;
temp = 1 switch
{
_ => span
};
}
奇妙なことに、代わりに宣言と割り当てをvar temp
のように変更すると、すべてうまく機能します。
このコードで同じ「モジュールの出力に失敗しました」エラーが発生しますが、「Const」を「Dim」に変更すると問題が解決します。
Dim userStatus1 As String = convAttrSet("user_status")
Dim userStatus2 As String = convAttrSet("user_status")
Const PENDING As Boolean = (userStatus1 = userStatus2)
理由:このエラーは、コードに奇妙なものがある場合に発生するようです。私にとっては、現在のユーザーをIDから取得するときに間違いを犯しました。
エラーコード: int currentUserId = User.Identity.GetUserId <>();
固定コード: GetUserID <---------->();の後にデータ型を指定してください;この場合、intを指定しています。
注この問題を見つけることができるように、コードを段階的に元に戻してください。しかし、それ以外の場合、そのエラーを追跡することは非常に困難でした。
ありがとう
私にとって、assemblyinfo.cs(NetRevisionTool.exe)を変更するポストビルドステップを追加した後に問題が発生しました。ビルドと編集の間でAssemblyInfo.csを変更しないように注意して、続行します。
エンティティへのlinqを使用しているときにこのエラーが発生し、linqクエリの結合句に構文エラーがありました
また、VB.NET(Visual Studio 2015-Pro)でこの例外がスローされ、エラーを引き起こしていた1行を分離しました
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 = ""
考えられる原因のリストに追加して、VS2019でC#8を使用すると、次のようなことを行うと、「モジュールの出力に失敗しました」というメッセージが表示されます。
_ = someBool ? SomeVoid() : default;
私はそれについてバグレポートをここに提出しました: https://github.com/dotnet/roslyn/issues/41741