2

Windows 워크 플로 파운데이션에 DLL을 디자인하는, 그리고 내 워크 플로우에서 이러한 활동을 위해 사용자 정의 디자인를 작성하고 싶습니다.만들기 사용자 정의 활동 디자인은 내가 <strong>사용자 활동</strong>와 <strong>Windows 워크 플로 파운데이션</strong>을 사용하고

저는 디자인 프로젝트와 디자이너 xaml을 만들 수 있습니다. 또한 워크 플로 프로젝트에서 디자인 프로젝트를 직접 참조하면 워크 플로에서 사용자 지정 디자인 을 볼 수 있습니다.

Designer DLL을 프로덕션 환경에 배포해서는 안되기 때문에이 작업을 수행하고 싶지 않습니다. Visual Studio 워크 플로 편집기에서 사용자 지정 디자인 만 갖고 싶습니다.

나는 다음을 추가하여 가지 작업을 얻을 수있었습니다 :
[Designer("namespace,dll")] 
public class CustomActivity : NativeActivity<string> 

이 복사 비주얼 스튜디오 경로에 DLL 후

. 이것은 모든 개발자가 이렇게해야하고 dll이 일부 고정 비주얼 스튜디오 경로를 복사하도록 빌드해야하기 때문에 내가 싫어하는 뭔가입니다. 아주 좋지 않습니다.

나는이 두 가지 예를 사용하지만,이 두 가지가 직접 DLL 참조 할 것 같습니다 : 나는 기능의이 종류를 가정 할

을 어떻게 든 Visual Studio/Workflow Foundation에서 지원할 수 있습니다.

해결 방법에 대한 의견이 있으십니까? 감사!

+0

내가 기억한다면 DesignerAttribute에 두 개의 문자열을 사용하는 오버로드가 있습니다. 하나는 네임 스페이스이고, 다른 하나는 유형 이름입니다. 이것을 사용하면 참조를 피할 수 있습니다. 하지만 1) 디자이너 AppDomain에 수동으로 어셈블리를로드하거나 2) 디자이너 어셈블리를 배치하는 방법에 대한 규칙을 따라야합니다. Visual Studio의 경우 [이 답변] (http://stackoverflow.com/a/8886905/1228)에이 내용을 문서화했습니다. 그것이 당신의 질문에 대답하기에 충분한 지 확신하지 못합니다. 어떻게 생각해? – Will

+0

빠른 답장을 보내 주셔서 감사합니다! 실제로 두 문자열에 과부하가 사용되고 있는지 확인하면됩니다. 나는 당신의 대답을 다른 질문에 체크했다. DLL이 Visual Studio 폴더 아래에 복사 될 수 있고, 그런 것들이 그런 식으로 작동 할 수 있다는 나의 이전 발견을 검증하는 것처럼 보인다. 그러나 나는 그 솔루션을 선호하지 않을 것이라고 언급했다. 또한 GAC 솔루션을 신속하게 시도했지만 (솔루션을 구축 할 때 GAC에 DLL을 등록하기 위해), 제대로 작동하지 못했습니다. 아마도 다시 시도해야합니다. –

+0

죄송합니다. 실제로 하나의 문자열 과부하를 사용하고 있습니다. –

답변

0

Designer 속성 ("magic"문자열 사용)은 매우 신뢰할만한 것이 아닙니다. 클래스 이름이나 네임 스페이스를 변경하면 컴파일 오류가 발생하지 않습니다. 이 IRegisterMetadata 구현을 사용하여 할 수있는 또 다른 (더 나은 이럴) 방법 : 활동 어셈블리를 참조해야합니다

  1. 귀하의 디자인 어셈블리는, 그러나 이것은 일반적으로 피할 수 없습니다.
  2. XAML 디자이너에 부분 클래스 (.cs) 추가
  3. 이 클래스는 System.Activities.Presentation.Metadata.IRegisterMetadata에서 상속해야합니다. 이 인터페이스는 구현할 하나의 메소드 만 정의합니다.

    public void Register() 
    { 
        AttributeTableBuilder builder = new AttributeTableBuilder(); 
        builder.AddCustomAttributes(
         typeof(MyActivity), 
         new DesignerAttribute(typeof(MyActivityDesigner))); 
        MetadataStore.AddAttributeTable(builder.CreateTable()); 
    } 
    

    다음, 당신은 비주얼 스튜디오에서 사용되는 사용자 지정 디자이너를 할 수 있습니다 : 여기

는 구현 샘플입니다. Visual Studio에는 디자이너 어셈블리를 자동으로로드하는 엄격한 규칙이 있습니다.

  1. 디자이너 프로젝트의 이름은 활동 프로젝트와 동일해야하며 끝에 ".Design"이 추가되어야합니다.예 :
    • Activiy 프로젝트 : MyApp.Activities.dll
    • 디자이너 프로젝트 : MyApp.Activities.Design.dll
  2. .Design의 DLL이 활동 DLL보다 같은 디렉토리에 있어야합니다. 디자이너 프로젝트에서 빌드 후 이벤트를 사용하여이를 자동화 할 수 있습니다.

중요 편집 :

나는 당신의 연결이 이미이 방법을 제시하는 것이 지금은 볼 수 있지만 당신은 직접 DLL을 참조하는 것을 말한다. 예, 디자인 dll이 활동 dll을 참조합니다. 하지만 반대로 물어보십시오 : dll은 dll을 참조하지 말아야합니다. IRegisterMetadata 메서드를 사용하면 DESIGN dll이 ACTIVITY dll을 참조 할 수 있습니다. 문제가 아닙니다. 출시 된 패키지에서 디자인 dll을 제거하면 dll 활동이 정상적으로 작동합니다.

+0

. 내가 제공 한 정확한 구성을 시도했지만 작동시키지 못했습니다. 디자인 DLL에서 활동 DLL을 참조하는 것은 완전히 괜찮습니다. 그리고이 방법을 사용하고 있습니다. 그 구성은 예제에서 수행 된 것과 매우 유사하지만 두 예제 모두에서 두 DLL을 모두 참조하는 세 번째 독립 실행 형 편집기 프로젝트가 있으며이 예제에서 작동하게 만듭니다. Visual Studio가 찾고있는 곳만 디자인 DLL이 자신의 IDE 폴더 안에 있습니다 (DLL 모니터링 도구로 DLL 조회를 모니터링했습니다). –

+0

그래서 Visual Studio 폴더에 DLL을 복사하면 디자인이 표시됩니다. 필자의 견해로는 메타 데이터 등록 자체가 정상이며 DLL의 이름 지정이 작동하고 있음을 증명합니다. –

+0

나는 또한 작동시키기가 힘들었지 만 DLL을 VS 폴더에 복사하지 않고도 작동시킬 수 있습니다. 그리고 나는 단 2 개의 프로젝트 (액티비티/디자이너)를 가지고 있으므로 바인딩은 디자이너 dll에 있고 3 번째 프로젝트에는 없다. 활동 dll에 대한 참조를 확인하십시오. 아마도 출력 폴더 (?)에서 참조하지 마십시오. .Design dll은 같은 폴더에 있어야합니다. 죄송합니다. 더 이상 도움이되지 않습니다. – Fabske

관련 문제