2011-01-05 2 views
0

У меня есть следующие типы (см. Часть кода ниже). Она составлена, но Regasm дает следующее сообщение об ошибке: «Method„LoadContent“в типа „MyAlgorithms.MyAlgorithm“из сборки„A“не имеет реализации»RegAsm: Метод «LoadContent» в типе «MyAlgorithms.MyAlgorithm» из сборки «A» не имеет реализации

имеет какие-либо идеи, почему? Если бы я не реализовал метод LoadContent(), он не был бы скомпилирован.

я видел почти такой же вопрос, здесь: TypeLoadException says 'no implementation', but it is implemented , но это не помогло, потому что:

A, B и C проекты находятся в том же растворе, и порядок сборки C, B и А .

"после сборки командной строки событие" всех проектов содержит следующие строки:

"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 SDK \ Windows \ v6.0A \ bin \ gacutil.exe "/ и $ (Имя_целевого_объекта)
"C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ Gacutil.exe"/, если $ (TargetPath)

Так что я думаю, что проект относится на правильные сборки.

И почему решает эту проблему, если я добавил к MyAlgorithmBase класса следующего:

защищены переопределения недействительным LoadContent (PersistenceReader читателя) {}

Спасибо!

Käte

// 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) 
    { 
    //.... 
    } 
} 
} 

ответ

0

Компилятор проверяет это. Что почти наверняка означает, что во время выполнения, когда Regasm.exe загружает сборку, она не загружает сборку, которую вы думаете, что она делает. У вас много возможностей, так как вы используете GAC. Который может создать старую версию зависимой сборки на основе номера [AssemblyVersion] в контрольной сборке.

Устраните это с помощью Fuslogvw.exe, запишите все привязки. Он показывает вам, откуда пришли все сборки.

Пребывание от такого рода неприятностей не размещение ваших сборок в GAC. Это детализация развертывания и не подходит для вашей машины-разработчика, где версии сборки могут быстро меняться, особенно когда вы позволяете системе сборки автоматически увеличивать их. Вы делаете это, используя параметр/codebase для Regasm.exe

+0

Привет, спасибо! Fuslogvw.exe говорит: операция прошла успешно. – BKate

+0

VisualStudio возвращает указанную ошибку, поскольку «Командная строка события после сборки» содержит RegAsm.exe. – BKate

+0

Хорошо, теперь я вижу! Если я изменил порядок вызова gacutil и regasm в «Командной строке события после сборки» проекта, он работает! – BKate