ASPNET_Compiler.exe からこのエラーを「渡す」のに問題があります。
エラー CS0103: 名前 'TestMath' は現在のコンテキストに存在しません。
ユーザー コントロール (.cs) ファイルから TestMath 内で呼び出される関数は、コンテキスト (スコープ/名前空間/...) の外にあります。TestMath 内のメソッドを呼び出す行をコメント アウトすると、コンパイルが機能し、ユーザー コントロール (WebApplication 内から DLL を参照) も機能します。
「TestMath」クラスは、-1+3 を返す 1 つの静的メソッド「Get」を含む静的クラスです (非静的を作成しようとしましたが、うまくいきませんでした)。
Visual Studio (MSBuild) での通常のビルドは機能しますが、ご存じのとおりです。.ascx ファイルを DLL に正しくパックしません。
以下を含む .rar を添付しました。
- テストライブラリ
1 つの .ascx コントロールと 1 つの数学クラスが含まれています
「BuildAssembly.cmd」を実行するビルド後のイベントが含まれており、次に aspnet_compiler と aspnet_merge を実行します。
- WebSite - ライブラリからコントロールを表示する 1 つの .aspx ページ。
エラーが発生する行は、Label.ascx.cs の 18 行目にあります。
Lbl.Text += " MATH: " + TestMath.Get()
何か提案はありますか?当ててみて?.ascx.cs 以外のクラスでメソッドを呼び出すことは禁止されていますか? ああ…でも、その言葉には何かがあります!つまり、次のように、User-Control クラス内に Math-class をコピーすると、次のようになります。
public class Label : UserControl
{
..methods of label
public class Math
{
public static Get()
}
}
ソリューションはコンパイルされ、両方のクラス内でメソッドを呼び出すことができます...しかし、私たち全員が望むように; 私も例外ではありません。他のオブジェクトも呼び出せるようにしたいのです (私は既に行っていますが、それらは GAC に存在するだけです...)...だから、うーん...基本的には; aspnet_compiler はどこで dll を探しますか...
サンプル ソリューションをダウンロード: http://s000.tinyupload.com/?file_id=76690332418132532036
ソリューションを C:\Solutions\Test に解凍すると、Visual Studio 2010、Windows 7... .NET フレームワーク 4 以降を想定して、ほとんど問題なく実行できます。
それ以外の場合、ここにいくつかのコードがあります: ASCX
<%@ Control Language="C#"
AutoEventWireup="true"
ClassName="TestLibrary.Controls.Label"
CodeFile="Label.ascx.cs"
CodeBehind="Label.ascx.cs"
Inherits="TestLibrary.Controls.LabelCode" %>
Test
<asp:Label runat="server" ID="Lbl"></asp:Label>
ASCX コードビハインド
protected void Page_Load(object sender, EventArgs e)
{
Lbl.Text = "CodeBehindText...";
Lbl.Text += " MATH: " + TestMath.Get();
}
テスト数学
public static int Get()
{
return -1 + 3;
}
BuildAssembly.cmd
SET compiler_path=%systemroot%\Microsoft.NET\Framework64\v4.0.30319
SET aspnet_merge=C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\aspnet_merge.exe
SET websiteproject=C:\Solutions\Test\TestLibrary\TestLibrary
SET compiled=C:\Solutions\Test\TestLibrary\TestLibrary\Compiled
SET outputfolder=C:\Solutions\Test\TestLibrary\TestLibrary\bin\Release
SET outputfilenamedll=TestLibrary.dll
%compiler_path%\aspnet_compiler.exe -p "%websiteproject%" -c -f -d -v / %compiled%
"%aspnet_merge%" %compiled% -o %outputfilenamedll%
COPY /Y %compiled%\bin\%outputfilenamedll% %outputfolder%\%outputfilenamedll%
RMDIR /s /q %compiled%
2015 年に ASCX でこのように「曖昧」になったのはなぜでしょうか? ああ、数年前に作成された ascx ファイルを再利用して、それらをライブラリに永久にパックし、アセンブリに署名し、SharePoint 環境にインポートしたいと考えていました...