2009-07-29 47 views
3

aspxページをASP.Netアプリケーションに読み込む方法を変更するVirtualPathProviderを作成しました。このプロセスの一環として、コードビハインドファイルを削除しました。私のページが特定のページクラスから継承していることを単に突き止めています。 例:BuildManager継承の継承

<%@ Page Language="C#" AutoEventWireup="true" Inherits="Namespace.PageClass" %> 

私はこれを行う場合、私は次の例外を取得:

HttpParseException Could not load type 'Namespace.PageClass'

を私も次のことを試してみました:

<%@ Page Language="C#" AutoEventWireup="true" Inherits="Namespace.PageClass, AssemblyName" %> 

これは、次のエラー生成:

HttpParseException Could not load the assembly 'AssemblyName'. Make sure that it is compiled before accessing the page.

私は、現在のアプリケーションドメインに必要なアセンブリをロードするアプリケーションの起動:私は問題を想定しています

AppDomain.Current.Load(...) 

現時点では、名前空間/アセンブリ参照を解決するBuildManagerの能力である....しかし、もし正直...それは推測です:-)

誰もがこれにいくつかの光を当てることはできますか?

+0

スタックトレースはありますか? –

+0

nope - これはページが解析されるときにSystem.Web内で起こります...私のためのスタックトレースはありません:-( –

答えて

2

ページに指定された完全なクラスの場所(例:Inherits="MyNamespace.MyClass, MyAssembly")を使用する必要があります。

は、その後のappDomainにアセンブリをロードするのAppDomainがそれを解決するつもりはありません。これは、動的にロードされたアセンブリを歩いていません。だから、AppDomain.ResolveAssemblyイベントのために登録する必要があります。

private Assembly myDynamicAssembly = null; 

protected void Application_Start(object sender, EventArgs e) 
{ 
     myDynamicAssembly = Assembly.LoadFrom(Server.MapPath("MyLocation/MyAssembly.dll")); 

     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
} 

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
     if (args.Name == "MyAssembly") 
     { 
      return myDynamicAssembly; 
     } 

     return null; 
} 

これで完了です。今、ランタイムは、この動的にロードされたアセンブリからクラスを解決する方法を知っています。

+0

イワン、感謝 - 私は一歩前進しましたが、ほんの少しのステップです! コンパイルエラーが発生する:CS0400:グローバル名前空間に型または名前空間名 'Namespace'が見つかりませんでした(アセンブリ参照がありません) public class default_aspx:global :: Namespace.PageClass 何かご意見は? –

+0

エラーの原因を投稿できますか。私はこれを複製することができません。 –

+0

こんにちはIvan、私はこれをさらに深く受け入れる別の質問を(完全なソースコードの例で)作成しました。新しい質問はこちら:http://stackoverflow.com/questions/1206634/dynamically-loading-page-class-assembly-type-or-name-could-not-be-found-in-the-g –

0

考えられる原因:

  1. あなたが.aspxのページまたはGlobal.asaxのページ内のモジュールの後ろに任意のコードやWebアプリケーションを参照する場合は、このエラーを取得し、その後構築されてhas'nt。アプリケーションを再度ビルドし、Webアプリケーションアセンブリの1つでNamespace.PageClass型が使用可能であることを確認してください。

    アセンブラをコンパイル時にaspxページにリンクするには、@Assemblyディレクティブを使用します。

    @ Assembly Name = "assemblyname" Src = "pathname"は、すべてのアセンブリのクラスとインターフェイスを使用できるようにします。

2.このようなエラーの理由は、IISで設定されたASP.NETのバージョンが間違っている可能性があります。

  • タイプinetmgrを押し、インターネットインフォメーションサービスを開きます(代わりに勝つキー+ Rを使用してください)ファイル名を指定して実行をクリックして、メニューを起動する

    1. IIS

      でGo]をASP.NETの正しいバージョンを選択する アプリケーション

    2. は、ローカルコンピュータ名を表示するツリーノードを展開し、Webサイトに移動 - > [既定のWebサイト

    3. を右既定のWebサイト]ノードとSEをクリックしてくださいポップアップメニューのオプションを選択してください。プロパティーページでプロパティー

      5.Navigate to ASP.NETタブをクリックし、正しい/最新のバージョンを設定します。

  • +0

    Pradeepneo - ありがとうございますが残念ながらそれはしませんでした これらのアセンブリは実行時に動的にロードされます。 @Assemblyディレクティブを使用して正しい場所にポイントすることはできません。 同様に、ページ継承ではなく、子コントロールの参照を解決するために使用される@Assemblyディレクティブはありません。 現在、Application_StartでAssemblyを動的にロードします。 :AppDomain.Current.Load(...)。 私が必要としていたものだと思っていました。 –