2011-01-05 3 views
0

다음 유형이 있습니다 (아래 코드 부분 참조). 컴파일하지만 RegAsm을 다음과 같은 오류를 제공한다 ". 어셈블리에서 형식 'MyAlgorithms.MyAlgorithm'메소드 'LoadContent' 'A'를 구현하지 않습니다"를RegAsm : 'LoadContent'형식의 'MyAlgorithms.MyAlgorithm'어셈블리에서 'A'에 구현이 없습니다.

은 어떤 생각이 왜 했습니까? LoadContent() 메서드를 구현하지 않으면 컴파일되지 않습니다.

은 여기 거의 같은 질문을했다 : TypeLoadException says 'no implementation', but it is implemented 를하지만 도움이되지 않았다, 때문에 :

A, B 및 C 프로젝트가 동일한 솔루션에 있고, 빌드 순서는 C, B와 A는 .

"C : \ WINDOWS \ Microsoft.NET 프레임 워크 \ \ 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 : \ 프로그램 파일 \은 Microsoft SDKs \ 윈도우 \ v6.0A \ 빈 \를하여 gacutil.exe "/ $ 경우 (있는 TargetPath)

그래서 내가 생각하는 프로젝트 A가 말한다 오른쪽 어셈블리에.

그리고 난 다음 MyAlgorithmBase 클래스에 추가하는 경우 문제를 해결하는 이유 :

보호 재정의 무효 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) 
    { 
    //.... 
    } 
} 
} 

답변

0

컴파일러는 이것을 검증한다. 거의 확실하게 런타임에 Regasm.exe가 어셈블리를로드 할 때 생각하는 어셈블리를로드하지 않는다는 것을 의미합니다. GAC를 사용하기 때문에 많은 기회가 있습니다. 참조 어셈블리의 [AssemblyVersion] 번호를 기반으로 이전 버전의 종속 어셈블리를 생성 할 수 있습니다.

Fuslogvw.exe를 사용하여이 문제를 해결하고 모든 바인딩을 기록하십시오. 모든 어셈블리의 출처를 보여줍니다.

이 아니므로 어셈블리를 GAC에 배치하십시오. 이것은 배치 세부 사항이며, 특히 빌드 시스템이 어셈블리 버전을 자동으로 증가시킬 때, 어셈블리 버전이 빠르게 변경 될 수있는 dev 시스템에는 적절하지 않습니다. 이렇게하려면 Regasm.exe에 대한/codebase 옵션을 사용하십시오.

+0

안녕하세요, 감사합니다! Fuslogvw.exe 메시지 : 작업이 성공적으로 완료되었습니다. – BKate

+0

프로젝트의 "빌드 후 이벤트 명령 줄"에 RegAsm.exe가 포함되어 있기 때문에 Visual Studio에서 언급 한 오류가 다시 나타납니다. – BKate

+0

좋아, 이제 알았어! 프로젝트의 "빌드 후 이벤트 명령 줄"에서 gacutil 및 regasm의 호출 순서를 변경 한 경우 작동합니다! – BKate

관련 문제