0

次のタイプがあります(以下のコード部分を参照)。これはコンパイルされますが、RegAsm は次のエラーを返します

理由はありますか?LoadContent() メソッドを実装しないと、コンパイルされません。

ここでほぼ同じ質問を見ました: TypeLoadException は「実装なし」と言っていますが、実装され ていますが、役に立ちませんでした。

A、B、および C プロジェクトは同じソリューション内にあり、ビルド順序は C、B、および A です。

すべてのプロジェクトの「ビルド後のイベント コマンド ライン」には、次の行が含まれます。

"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" /u $(TargetPath)
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" $(TargetPath)
"c:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" /u $(TargetName)
"c:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" /if $(ターゲットパス)

したがって、プロジェクト A は適切なアセンブリを参照していると思います。

MyAlgorithmBase クラスに次を追加すると、問題が解決するのはなぜですか。

protected override void LoadContent(PersistenceReader リーダー) { }

ありがとう!

ケーテ

// C.dll from project C
namespace Microsoft.SqlServer.DataMining.PluginAlgorithms
{
 public abstract class AlgorithmBase : IDisposable
 {
  //....
  protected abstract void LoadContent(PersistenceReader reader);
 }
}

//in B.dll from project B, refers C.dll
namespace AlgorithmCommons
{
 public abstract class MyAlgorithmBase : AlgorithmBase
 {
  //....
  // Why solves the problem if the next line is commented out?
  // protected override void LoadContent(PersistenceReader reader) { }
 }
}

//in A.dll from project A, refers B.dll and C.dll

namespace MyAlgorithms
{
 public class MyAlgorithm : MyAlgorithmBase
 {
  protected override void LoadContent(PersistenceReader reader)
  {
  //....
  }
 }
}
4

1 に答える 1

0

コンパイラはこれを検証します。これはほぼ確実に、実行時に Regasm.exe がアセンブリを読み込むときに、想定しているアセンブリを読み込まないことを意味します。GAC を使用しているため、これには多くの機会があります。参照アセンブリの [AssemblyVersion] 番号に基づいて、依存アセンブリの古いバージョンを生成できます。

これを Fuslogvw.exe でトラブルシューティングし、すべてのバインドをログに記録します。すべてのアセンブリがどこから来たのかを示します。

アセンブリを GAC に配置しないことで、この種の問題を回避してください。これは展開の詳細であり、アセンブリのバージョンが急速に変化する可能性がある開発マシンには適していません。特に、ビルド システムに自動的にインクリメントさせる場合はそうです。これを行うには、Regasm.exe の /codebase オプションを使用します。

于 2011-01-05T16:45:53.273 に答える