2014-03-01 6 views
10

별도의 DLL 클래스 라이브러리로 빌드 된 다른 응용 프로그램 인 Autodesk Revit에 대한 추가 기능을 개발하고 있습니다. 내 WPF 창 중 하나에서 Wpf Tool Kit Property grid을 사용하려고합니다. 속성 표는 Visual Studio에서 잘 표시되며 intellisense도 작동합니다. 하지만 내 애드 인으로 Revit을 시작하려고하면 다음 예외가 발생합니다.파일 또는 어셈블리 'Xceed.Wpf.Toolkit을로드 할 수 없습니다.

System.Windows.Markup.XamlParseException occurred 
    HResult=-2146233087 
    Message=Could not load file or assembly 'Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4' or one of its dependencies. The system cannot find the file specified. 
    Source=PresentationFramework 
    LineNumber=133 
    LinePosition=27 
    StackTrace: 
     at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
    InnerException: System.IO.FileNotFoundException 
     HResult=-2147024894 
     Message=Could not load file or assembly 'Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4' or one of its dependencies. The system cannot find the file specified. 
     Source=mscorlib 
     FileName=Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4 
     FusionLog==== Pre-bind state information === 
LOG: User = GLOBAL\eric.anastas 
LOG: DisplayName = Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4 
(Partial) 
WRN: Partial binding information was supplied for an assembly: 
WRN: Assembly Name: Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4 | Domain ID: 1 
WRN: A partial bind occurs when only part of the assembly display name is provided. 
WRN: This might result in the binder loading an incorrect assembly. 
WRN: It is recommended to provide a fully specified textual identity for the assembly, 
WRN: that consists of the simple name, version, culture, and public key token. 
WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue. 
LOG: Appbase = file:///C:/Program Files/Autodesk/Revit 2014/ 
LOG: Initial PrivatePath = NULL 
Calling assembly : PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Program Files\Autodesk\Revit 2014\Revit.exe.Config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit.EXE. 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.EXE. 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit.EXE. 
LOG: Attempting download of new URL file:///C:/Program Files/Autodesk/Revit 2014/SDA/bin/Xceed.Wpf.Toolkit/Xceed.Wpf.Toolkit.EXE. 

     StackTrace: 
      at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
      at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
      at System.Reflection.Assembly.Load(AssemblyName assemblyRef) 
      at System.Windows.Baml2006.Baml2006SchemaContext.ResolveAssembly(BamlAssembly bamlAssembly) 
      at System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlTypeToType(BamlType bamlType) 
      at System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlType(BamlType bamlType, Int16 typeId) 
      at System.Windows.Baml2006.Baml2006SchemaContext.GetXamlType(Int16 typeId) 
      at System.Windows.Baml2006.Baml2006Reader.Process_ElementStart() 
      at System.Windows.Baml2006.Baml2006Reader.Process_OneBamlRecord() 
      at System.Windows.Baml2006.Baml2006Reader.Process_BamlRecords() 
      at System.Windows.Baml2006.Baml2006Reader.Read() 
      at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector) 
      at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
     InnerException: 

일반적으로 나는 REVIT에서 단순히 제 3 자 DLL 내 플러그인 DLL과 동일한 위치에 복사되어 있는지 확인 플러그 - 인 제 3 자 어셈블리를 참조 할 때. 내가 체크했고 Xceed.Wpf.Toolkit.dll이 내 플러그인 DLL이 들어있는 디렉토리에 복사 중이다.

Revit 프로그램 디렉토리에서 DLL을 찾고 있다는 오류 메시지가 나타났습니다. Xceed.Wpf.Toolkit.dll을이 디렉토리에 복사 한 후에 더 이상 오류를받지 않습니다.

그러나 플러그인 파일이 자체 격리 된 폴더에있는 기존 플러그인 배포 도구가 있습니다.

그래서 WPF Toolkit 라이브러리를 찾기 위해 플러그인을 얻는 방법을 알고있는 사람이 있습니까?

+0

나는 해결책을 모른다. 그러나 나는 과거에 그것을 사용했고 약간의 오류가 있었다. 나는 너에게 1 가지를 제안 할 수있다. dll 파일을 마우스 오른쪽 버튼으로 클릭하십시오. 속성으로 이동하여 차단 해제하십시오. 나는 이것이 도움이 될 것이라고 생각한다. – Vishal

+0

나도 같은 문제에 직면 : .. ( –

답변

9

그래서, 나는 그것이이 시간을 제외하고, 어셈블리에서 WPF 컨트롤을로드하는 것은 XamlParseException를 슬로우 저도 같은 문제로 실행 2014

오늘부터 나의이 질문에 대한 새롭고 더 나은 솔루션을 발견 내가 만든 WPF 컨트롤 라이브러리 어셈블리를 사용합니다.

나는 EXE와 같은 폴더에 DLL을 옮겨 보았는데, 이전과 마찬가지로이 문제가 해결되었습니다. http://www.telerik.com/forums/xamlparseexception-could-not-load-file-or-assembly

그것은 당신이 단순히 x:Name 속성을 추가하여, 컨트롤의 이름을 지정하는 경우 판명이이이에 대한 참조를 추가합니다 :

약간의 검색 후, 나는 telerik.com 포럼에이 질문을 발견 코드 숨김을 제어하고 어떤 이유로 어셈블리를로드 할 때 발생하는 문제를 해결합니다. 컨트롤이 XAML, 당신의 Xceed.Wpf.Toolkit.dll가로드되는 호출 어셈블리에서로드 할 때

<!--This causes a XamlParseException --> 
    <:MyCustomControl /> 

    <!-- This works --> 
    <mylib:MyCustomControl x:Name="foobar"/> 
+0

나를 위해 (그리고 Cefsharp를 사용하여) 이름을 추가해도 코드 숨김에 대한 참조가 추가되지 않았습니다. 추가 된 참조가 어떻게 보이는지 보여 주시겠습니까? – Garrett

+1

@Garrett, 생각에 따르면 코드 숨김의 자동 생성 부분에이 아이디어가 추가 된 것 같습니다. 'obj \ MainWindow.g.i.cs '와 같은'obj' 폴더에서 찾을 수 있어야합니다. 코드 숨김 코드는 부분 클래스이므로이 코드는 함께 클래스 전체에 포함됩니다. 'x : Name'을 사용할 때, 그 파일에 라인이 나타날 것으로 기대합니다. –

0

System.Reflection 네임 스페이스에는 Assembly 클래스가 있습니다. 현재 AppDomain에 새 어셈블리를로드하는 데 사용할 수 있습니다.

Assembly.LoadFrom("FileLocation"); 

이것은 여전히 ​​성가신 일이지만, 메인 디렉토리가 아닌 라이브러리를로드하는 유일한 방법 일 수 있다고 생각합니다.

8

나는이 접근 방식의 팬이다. AssemblyResolve 이벤트에 대한 AppDomain에 이벤트를 등록 할 수 있습니다.이 이벤트는 어셈블리를로드 할 수 없을 때 발생합니다. 언급 한 바와 같이 나는 개인적으로 당신이 그 일을해야한다고 생각하지만

+0

고마워요! –

1

...

// using System.Reflection and System.IO 

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

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    if (args.Name.ToUpper().StartsWith("XCEED.WPF")) 
    { 
     string asmLocation = Assembly.GetExecutingAssembly().Location; 

     string asmName = args.Name.Substring(0, args.Name.IndexOf(',')); 
     string filename = Path.Combine(asmLocation, asmName); 

     if (File.Exists(filename)) return Assembly.LoadFrom(filename); 
    } 
} 

당신은 이것보다 조금 더 완벽 할 수 있습니다,하지만 당신은 아이디어를 얻을 :

은 다음과 같습니다 허용 된 대답 (@Matt 기준)에서 dll을 Autodesk Revit 설치의 "Program"폴더에 복사하면 트릭을 수행 할 수도 있습니다. 올바르게 기억한다면,이 폴더의 하위 폴더에 추가 기능을 배치하여 제대로 작동하는지 확인할 것을 제안합니다. 나는 그것이 당신이 가진 것과 같은 효과 때문이라고 생각합니다.

+1

허용되는 솔루션은 Property Grid에서 작동하지만 Avalon Dock에서는 작동하지 않습니다. 그러나 모든 WPF Tool Kit 및 Avalon Revit 프로그램 파일 폴더의 Dock DLL이 작동하지만이 작업은 Revit 애드 인용으로 개발 한 설치 프로세스에서 작동하지 않습니다. WPF Toolkit dll에서이 문제가 발생하는 이유는 무엇입니까? DLL을 내 추가 기능 DLL과 동일한 위치에 복사하여 타사 라이브러리를 포함 할 수 있습니다. –

+0

@EricAnastas, 아니요, 죄송합니다. 지금 당장은 잘 모릅니다. –

+0

"Program"폴더에 DLL을 추가하면 제대로 작동하지만 빌드 폴더를 하위 폴더에 복사하면 ('AddIns' 하위 폴더에 넣음) 작동하지 않습니다. 나는 DLL이'revit.exe'의 형제 여야한다는 것을 알고 있습니다. 추가 기능을 하위 폴더로 배포 할 것을 권장하는 위치에 대한 참조가 있습니까? – Garrett

6

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만, 나는이 정확한 오류를 너무 오래 전에 보지 못했다. Visual Studio 응용 프로그램에서 두 프로젝트 또는 다른 프로젝트를 참조하는 프로젝트를 사용하는 경우 두 프로젝트 모두 확장 툴킷이 설치되어 있는지 확인합니다.

두 프로젝트를 마우스 오른쪽 단추로 클릭하고 "NuGet 패키지 관리"를 클릭 한 다음 대화 상자의 왼쪽에서 "설치된 패키지"를 찾습니다. 두 프로젝트에서 확장 툴킷을 볼 수 없다면 관리자를 사용하여 온라인으로 검색하고 설치할 수 있습니다.

내 문제는 확장 된 툴킷이 하나의 프로젝트에만 설치되어 있다는 것이 었습니다.

앞으로 도움이되기를 바랍니다.

+0

예외로 google'd하고 전체 질문을 읽지 않고 답장했습니다. 질문을 완전히 읽으려면 시간을내어 투표를 한 이유를 이해하게 될 것입니다. – Pluc

5

아마도이 문제가 해결되었지만 Xceed.Wpf.Toolkit dll을 엔트리 포인트 프로젝트에 추가하지 않는 것이 일반적인 이유입니다. 아마 당신의 클래스 라이브러리 프로젝트 중 하나에 그것을 추가하고 "로컬 복사"속성을 true로 설정하십시오. 이 dll에 대한 참조는 "Copy Local"속성이 true로 설정된 App.xaml.cs가 포함 된 기본 프로젝트에도 추가되어야합니다.

Visual Studio 2013에서 자동으로 처리하지 않습니다.

+0

고마워요 ...이 일은 내 견과를 몰고 있었고, 무슨 일이 일어나고 있는지 알 수 없었습니다. – Jon

0

Xceed 어셈블리의 "차단 해제"를 확인하십시오. 파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 다음 "차단 해제"하십시오. VS는 오류없이 코드를 컴파일하지만 실행하면 Windows에서 어셈블리를로드하지 않습니다. 광산은 단일 조립품으로 병합되었습니다.

0

을 사용하여 Xceed.Wpf.Toolkit.dll을 컴파일 된 .dll에 포함 시켰습니다. NuGet을 사용하여 설치하고 Packet Manager ConsoleInstall-CleanReferencesTarget을 입력하면됩니다.

0

PresentationFramework.dll입니다. 따라서 CLR은이 경우 addin 폴더를 조사하지 않습니다 (호출 어셈블리의 폴더를 조사하기 때문에 다른 클래스가 추가 기능의 주 어셈블리에서로드 될 때 수행중인 작업).

코드 숨김에 컨트롤에 대한 참조를 넣거나 AppDomain.CurrentDomain.AssemblyResolve을 사용하여 CLR이 추가 기능 폴더를 찾도록 할 수 있습니다.

dll을 Revit 설치 폴더에 넣는 것은 효과가 있지만, 다른 애드 인 설치에서 덮어 쓸 수 있으므로 측정하기 어려운 결과를 가져올 수 있으므로 내 관점에서는 좋지 않습니다.