ASP.NET 4.0でAとBの2つのWebソリューションを作成しました。また、サードパーティのユーザーコントロールとフォーム認証を使用して、データ入力Webフォーム(DataEntery.aspx)をソリューションAに追加しました。
WebページDataEntery.aspxをソリューションBに再利用したいのですが、そのための最良の方法は何ですか?
ASP.NET 4.0でAとBの2つのWebソリューションを作成しました。また、サードパーティのユーザーコントロールとフォーム認証を使用して、データ入力Webフォーム(DataEntery.aspx)をソリューションAに追加しました。
WebページDataEntery.aspxをソリューションBに再利用したいのですが、そのための最良の方法は何ですか?
最良の方法は、Web ページを含む dll を作成することです。
この dll を参照して、プロジェクトに含まれるコードを取得できます。
VirtualFile
クラスを使用して、dll に埋め込まれたリソースを読み込むことができます。ここに例があります
public class SVirtualFile : VirtualFile
{
private string m_path;
public SVirtualFile(string virtualPath)
: base(virtualPath)
{
m_path = VirtualPathUtility.ToAppRelative(virtualPath);
}
public override System.IO.Stream Open()
{
var parts = m_path.Split('/');
var assemblyName = parts[1];
var resourceName = parts[2];
assemblyName = Path.Combine(HttpRuntime.BinDirectory, assemblyName);
var assembly = System.Reflection.Assembly.LoadFile(assemblyName + ".dll");
if (assembly != null)
{
return assembly.GetManifestResourceStream(resourceName);
}
return null;
}
}
VirtualPathProvider
仮想ファイルを提供していることをasp.netが認識できるように、アプリケーションのライフサイクルにフックして登録する必要があります。
public static class AppStart
{
public static void AppInitialize()
{
SVirtualPathProvider sampleProvider = new SVirtualPathProvider ();
HostingEnvironment.RegisterVirtualPathProvider(sampleProvider);
}
}
public class SVirtualPathProvider : VirtualPathProvider
{
public SVirtualPathProvider()
{
}
private bool IsEmbeddedResourcePath(string virtualPath)
{
var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith("~/Succeed.Web/", StringComparison.InvariantCultureIgnoreCase);
}
public override bool FileExists(string virtualPath)
{
return IsEmbeddedResourcePath(virtualPath) || base.FileExists(virtualPath);
}
public override VirtualFile GetFile(string virtualPath)
{
if (IsEmbeddedResourcePath(virtualPath))
{
return new SVirtualFile(virtualPath);
}
else
{
return base.GetFile(virtualPath);
}
}
public override CacheDependency GetCacheDependency( string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
if (IsEmbeddedResourcePath(virtualPath))
{
return null;
}
else
{
return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
}
}
共有機能を持つユーザー コントロールを保持するソリューション C と呼ばれる 3 番目の Web アプリケーションを作成できます。ソリューション A と B にソリューション C への参照を追加するよりも。
例:方法: Visual Basic .NET を使用してアプリケーション間で ASP.NET ページとユーザー コントロールを共有する
これを行う方法の 1 つは、DataEntry.aspx とコード ビハインド クラスをリンクとしてプロジェクトに追加することです。また、DataEntry.aspx ページが配置されている共有ディレクトリからプロジェクトに追加されたディレクトリにコピーするロジックを追加する必要があります。これを行うには、プロジェクトの PreBuild イベントにコマンド ライン コマンドを記述するか、次の内容で CopyLinkedContentFiles.targets ファイルを作成します。
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildDependsOn>
CopyLinkedContentFiles;
$(BuildDependsOn);
</BuildDependsOn>
</PropertyGroup>
<Target Name="CopyLinkedContentFiles">
<!-- Remove any old copies of the files -->
<Delete Condition=" '%(Content.Link)' != '' AND Exists('$(WebProjectOutputDir)\%(Content.Link)') "
Files="$(WebProjectOutputDir)\%(Content.Link)" />
<!-- Copy linked content files recursively to the project folder -->
<Copy Condition=" '%(Content.Link)' != '' " SourceFiles="%(Content.Identity)"
DestinationFiles="$(WebProjectOutputDir)\%(Content.Link)" />
</Target>
</Project>
そして、リンクとして追加されたページを参照するこのターゲットをプロジェクトに含めます。Web アプリケーションの csproj ファイルに次の行を追加することで実行できます。
<Import Project="$(MSBuildProjectDirectory)\[RELATIVE PATH TO FILE]\CopyLinkedContentFiles.targets" />
この行は、たとえば、csproj ファイルの次の行の後に追加する必要があります。
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />