Wie kann ich CRMSvcUtil.exe erzeugen, unduplicated, fehlerfreie früh gebundene Optionssätze?

8

Ich benutze Erik Pools Implementierung von ICodeWriterFilterService und Manny Grewals GenerateOption funktioniert als Modell, um unerwünschte Entitäten in der Datei herauszufiltern, die CRMSvcUtil generiert. Während Erik empfiehlt, true für die GenerateOptionSet -Methode zurückzugeben, um enums für Optionssätze zu generieren, werden dadurch alle globalen Optionssätze dupliziert, die von einer bestimmten Entität verwendet werden (wie in einer der Kommentare zu diesem Beitrag).

Um dies zu beheben, überprüfe ich, ob der Optionssatz bereits generiert wurde, und falls dies der Fall ist, gebe ich die Standardoption (vermutlich false für die meisten Fälle) wie im Folgenden zurück.

%Vor%

Aber bei der Einbindung der generierten Datei in meine CRM-Projekte, der Kompilierungsfehler

%Vor%

wird immer von jeder Codezeile ausgelöst, die aussieht wie

%Vor%

.

Als Workaround verwende ich ein separates Projekt, in dem ich die benötigten Entitäten filtern kann, CRMSvcUtil mit den von Erik vorgeschlagenen Argumenten ausführen, den problematischen Teil des Codes (int)(value) ersetzen (wobei value ein OptionSetValue ist) ) mit value.Value , nachdem die Datei generiert wurde, und dann die Datei erneut speichern, und alle Probleme verschwinden.

Meine Frage ist folgende: Muss ich etwas anders machen, das diesen Kompilierungsfehler mit der standardmäßigen CRMSvcUtil generierten Datei behebt, ohne etwas so Haschisches wie das Ändern der generierten Datei zu machen?

    
Peter Majeed 20.01.2012, 18:37
quelle

6 Antworten

2

Ich wette, dass Guaravs Antwort der richtige Weg ist, aber da Dokumentation zu CRMSvcUtil fehlt, bin ich gezwungen, meine Problemumgehung zu verwenden. (Ich benutze ein separates Projekt, wo ich die benötigten Entitäten filtere, führe CRMSvcUtil mit den von Erik vorgeschlagenen Argumenten aus, ersetze den problematischen Teil des Codes (int)(value) (wobei value ein OptionSetValue ist) mit value.Value nach Die Datei wird generiert und anschließend erneut gespeichert.)

Keine perfekte Lösung, aber ich habe an den wenigen Beispielen gearbeitet, mit denen ich bisher gearbeitet habe.

    
Peter Majeed 18.06.2012, 17:55
quelle
4

Sie können die ICustomizeCodeDomService -Schnittstelle verwenden, um die SetAttributeValue -Methode für die OptionSets neu zu schreiben. Snippet unten:

%Vor%

}

    
Gaurav Dalal 23.01.2012 05:33
quelle
4

Einige Änderungen an der UpdateEnumSetter-Methode:

%Vor%     
JFK007 10.08.2012 10:25
quelle
2

Es stellt sich heraus, dass dieser Fehler mit dem Code zu tun hat, der versucht, Optionsgruppen zu erstellen, die wie der folgende Code aussehen, wenn die Typen zur Verwendung verfügbar sind. Beachten Sie, dass der einzige Unterschied darin besteht, dass der richtige Typ für den Rückgabetyp und die Besetzung ausgewählt wurde.

Es sollte möglich sein, das Codegen-Zeug zu aktualisieren, um diesen Fehler zu beheben, aber es könnte besser sein, Microsoft zu bekommen, um das verdammte Ding richtig zu beheben, würde ich eine Lösung machen, aber ich nicht wirklich Zeit haben, es jetzt zu implementieren, weil wir eine größtenteils funktionierende Lösung haben, selbst wenn wir mit der Optionsetvalue-Klasse umgehen müssen.

%Vor%     
Rhys Bevilaqua 14.02.2014 06:06
quelle
1

Ich bin endlich in der Lage, eine frühe gebundene Klasse mit einem gefilterten Satz von Entitäten und fehlerfreien Optionssätzen zu erzeugen. Ich habe den Großteil meiner Antwort durch diesen Thread gefunden, also danke Jungs. Das Problem ist jedoch, dass es schwierig ist, all die verschiedenen Vorschläge in etwas zusammenzufassen, das tatsächlich ... kompiliert. Also dachte ich, ich würde meine endgültige Lösung zum Wohle anderer posten, hier ist, was bei mir funktioniert hat.

Ich benutzte die Lösung von Erik Pool, Manny Grewal und Peter Majeed, um nur eindeutige enums mit korrekten Werten auszugeben, und kombinierte dann diese mit der Lösung von Gaurav Dalal (aktualisiert von JFK007, um den Cast-Fehler zu beheben), um SetAttributeValue das neu zu schreiben verursachte den (int)(value) Fehler. Und als zusätzlichen Bonus habe ich dieselbe Lösung zum Filtern bestimmter Optionssätze verwendet, um auch nach bestimmten Optionssatzwerten zu filtern (was ein Problem in meiner Organisation war).

Das Ergebnis ist eine Klassenbibliothek, die CodeWriterFilter und CustomizeCodeDomService , die cmd-Stapeldatei zum Ausführen von CrmSvcUtil.exe und die filter.xml zum Filtern der Entitäten enthält.

Fügen Sie in Ihrer Klassenbibliothek Verweise auf CrmSvcUtil.exe , Microsoft.Xrm.Sdk und System.Runtime.Serialization hinzu, kompilieren Sie dann die DLL und kopieren Sie sie in den gleichen Ordner wie Ihr CrmSvcUtil.exe . Verwenden Sie den enthaltenen Befehl, um auf Ihre neue Assembly zu verweisen, und erstellen Sie die frühe gebundene Klassendatei.

CodeWriterFilter :

%Vor%

CustomizeCodeDomService :

%Vor%

CrmSvcUtil_run.cmd Befehlsstapeldatei:

%Vor%

filter.xml

%Vor%     
ryguy 13.02.2015 21:08
quelle
0

Es sieht so aus als ob ein Fehler in der crmsrvcutil behoben wurde. Mein Code für OptionSet-Eigenschaften sieht jetzt so aus:

%Vor%

Und ich bekomme keinen Fehler bei der Einstellung von OptionSetValue ...

    
Daryl 01.11.2012 13:21
quelle