| Francesco Castigliego |
problema con parametri dei metodi
Con la trasformazione delle classi in servicedcomponent ho riscontrato un problema che non riesco a risolvere: se chiamo un qualsiasi metodo con parametri di tipo base, int, string, non ho nessun errore , se tra i parametri c'è un enum definito da me ottengo un errore stranissimo:
File or assembly name "myAssembly", or one of its dependencies, was not found. ma l'assembly c'è dato che gli altri metodi funzionano benissimo, ho l'impressione che gli enum non vengano esposti con le interfacce dei componenti, come posso risolvere questo problema? manca qualche dichiarazione da qualche parte? ringrazio in anticipo x l'attenzione Francesco |
| Francesco Castigliego |
Re: problema con parametri dei metodi
Scusate se insisto, ma non c'è proprio nessuno che sa come risolvere questo problema? sono rimasto bloccato!! è tutto il pomeriggio che cerco su MSDN e su altri forum ma non ho trovato nulla.
|
| Raffaele Rialdi |
Re: problema con parametri dei metodi
Prova ad assegnare all'enumerazione un tipo di base:
public enum myEnum : byte { a, b } Se non funziona ancora prova a fare il cast dell'enum con il tipo di base quando lo passi come parametro. Raffaele |
| Andrea Piccoli |
Re: problema con parametri dei metodi
Ho incontrato un problema simile in C# e sembra legato alla serializzazione.
Infatti a causa del marshall delle interfacce com, sotto ai serviced components ci stà la serializzazione. I tipi base lo sono, ma non gli enum. In c# ho risolto scrivendo: [XmlType(IncludeInSchema=false)] public enum ParamDirection { IN = 0 , OUT , INOUT , RETURN } e rendendo la classe che utilizza l'enum serializzabile [Serializable()] public class Parameter { /// <summary> /// nome /// </summary> public string Name ; /// <summary> /// dimensione /// </summary> public int Size ; /// <summary> /// tipologia di parametro, tipo dato /// </summary> public ParamType Type ; /// <summary> /// direzione del paramtero, in / out /// </summary> public ParamDirection Direction ; /// <summary> /// valore del parametro (object type) /// </summary> public object Value ; } Chiaramente la serialize e la deserialize in una stringa, ho dovuto farmela a manina, ma questo è sicuramente un mio bug. [continuo a credere che avrebbe dovuto farla il framework] |
| Francesco Castigliego |
Re: problema con parametri dei metodi
ho provato tutti e due i suggerimenti ma non vanno, avevo tralasciato di dire che il servicecomponent è stato realizzato in vb.net, ma non credo ci sia differenza con il c#.
Non riesco sinceramente a comprendere questo problema dato che gli enum sono in pratica interi. grazie comunque per il suggerimento. |
| Raffaele Rialdi |
Re: problema con parametri dei metodi
Il problema può essere che l'enum è comunque un nuovo tipo. Hai provato a eseguirci un cast con un intero?
Raffaele |
| Francesco Castigliego |
Re: problema con parametri dei metodi
Si, ho provato tutti e due i metodi che mi suggerivi al post precedente, il cast non va, infatti intuisco che il compilatore traduca il mio cast di nuovo nel tipo dichiarato nel parametro ottenendo un nulla di fatto. per curiosità ho modificato la firma del metodo utilizzando l'intero in questo caso riprende a funzionare.
Ora però posso dire di più, credo che sia un problema del framework o di visualstudio, mi spiego: ho notato che quando registro la DLL dei componenti, durante la registrazione viene creato il .TLB. Penso che il problema sia quando aggiungo il riferimento dalla mia applicazione web, il visualstudio, si fa una copia della DLL nella bin del progetto web, ed ho notato che non si copia anche il file .tlb. io penso possa dipendere da questo, dato che l'eccezione è "file non trovato" ed il testo del messaggio dice esplicitamtente che l'assembly o una delle sue dipendenze non è stato individuato. Una piccola riflessione (naturalmente non riferita a te, Raffaele): E' finita l'era delle "DLL Hell" ed è incominciata quella dei "File Hell"? non ho voglia di fare marcia in dietro sui servicedcomponents. Francesco. |
| Raffaele Rialdi |
Re: problema con parametri dei metodi
In C++, affinchè un enumerazione sia utilizzabile come tipo del componente COM, devi dichiarare l'enumerazione nel file idl. Di conseguenza la troverai disponibile anche nel sorgente C++ perchè midl genera un include file che deve essere incluso nel sorgente.
Non ho mai provato questa cosa con i serviced components ma spero che questa info ti possa fornire qualche lume. Sfortunatamente ho poco tempo e non posso provarlo. Prova a dare un occhio al tlb con oleview per capire cosa viene generato. Ovviamente funziona se converti tutto in int ma ti perdi il vantaggio di poter usare i tipi creati con le enumerazioni. Raffaele |
| Andrea Bini [MS] |
Re: problema con parametri dei metodi
Ho provato a riprodurre il tuo problema, ma non riesco a generare il tuo stesso errore.
Potresti darmi qualche indicazione in più sul tuo scenario: - l'applicazione COM+ è configurata come Server o come Library - hai utilizzato REGSVCS per registrare l'assembly ? - l'assembly è nella GAC o è nella directory bin della tua applicazione web ? Inoltre potresti usare un tool tipo FileMon (www.sysinternals.com) per capire qual'e' il file che non viene trovato (e per escludere problemi di permissions) Grazie Andrea Bini [MS] |
| Francesco Castigliego |
Re: problema con parametri dei metodi
Be in effetti il problema è simile anche se a te capita sulla classe serializzabile, mentre a me capita sulla classe del componente, sfortunatamente non posso gestire la cosa a manina come hai fatto tu per due motivi, uno: il mio progetto conta un discreto numero di componenti con queste caratteristiche, ed ogni componente ha un discreto numero di metodi, seconda cosa io non serializzo la classe, ma chiamo solamente il metodo del componente.
grazie comunque per la risposta, sono convinto che se risolvo io il problema ne trarrai vantaggio anche tu, sono d'accordo con te nel fatto che dovrebbe essere il framework a gestire in automatico la cosa. speriamo bene. Francesco |
| Francesco Castigliego |
Re: problema con parametri dei metodi
innanzitutto il framework che utilizzo è ancora 1.0, (ancora per poco)
La mia applicazione è formata da 3 progetti: workflow.dll (business logic) service.exe (servizio di sistema) applicazione web (asp.net, genera l'errore) i componenti sono registrati automaticamente quando viene lanciato il servizio service.exe (che ne fa uso) dato che il servizio e applicazione web girano in due path diversi, e dato che il .tlb viene creato solo al momento della registrazione, credo che il problema sia questo, l'applicazione web non vede (penso) il tlb generando l'errore. ho provato a copiare fisicamente il tlb nella bin del web, ma non funziona. gli atributi dell'assembly sono questi <Assembly: AssemblyKeyFileAttribute("key.snk")> <Assembly: AssemblyTitle("")> <Assembly: AssemblyDescription("application description")> <Assembly: AssemblyCompany("")> <Assembly: AssemblyProduct("")> <Assembly: AssemblyCopyright("")> <Assembly: AssemblyTrademark("")> <Assembly: CLSCompliant(True)> <Assembly: ApplicationName("myApp")> <Assembly: ApplicationActivation(ActivationOption.Server)> le classi ed i metodi non hanno nessun attributo Public Class myClass inherits ServicedComponent Public Enum myEnum As Integer value1 = 0 value2 = 1 End Enum public Function setItem(ByRef ID as integer, ByRef Name As String, ByVal Tipo As myEnum) As Integer end function end class le classi seguono tutte questo prototipo Riguardo alla domanda se l'assembly è in GAC o nel bin, ma ho letto che gli assembly che contengono componenti non dovrebbero essere nella GAC. mi sb aglio? Francesco |
| Andrea Bini [MS] |
Re: problema con parametri dei metodi
A prima vista non sembrerebbe un problema dovuto al file tlb (ma potrei sbagliarmi), quanto piuttosto un problema nel caricare l'assembly.
Puoi mandarmi il contenuto completo dell'eccezione (compreso il call-stack) ? Inoltre tieni presente che è sconsigliato registrare i componenti sfruttando "l'auto-registrazione", in ambiente di produzione è necessario registrare i componenti usando REGSVCS.EXE (anche se non dovrebbe essere questo il problema) Grazie Andrea Bini [MS] |
| Francesco Castigliego |
Re: problema con parametri dei metodi
FORSE HO TROVATO, ho utilizzato l'utility che mi hai suggerito per vedere che file cercava, bella scoperta:
cercava: c:\windows\assembly\GAC\policy.1.0.workflow workflow.dll è la mia dll. sinceramente ancora non so cosa fare per aggirare il problema comunque avevo già catturato l'eccezzione e lo stack: {System.IO.FileNotFoundException} [System.IO.FileNotFoundException]: {System.IO.FileNotFoundException} Object: {System.IO.FileNotFoundException} _COMPlusExceptionCode: -532459699 _className: Nothing _exceptionMethod: Nothing _exceptionMethodString: Nothing _message: "File or assembly name WorkFlow, or one of its dependencies, was not found." _innerException: Nothing _helpURL: Nothing _stackTrace: {System.Array} _stackTraceString: Nothing _remoteStackTraceString: Nothing _remoteStackIndex: 0 _HResult: -2147024894 _source: "mscorlib" _xptrs: 0 _xcode: -532459699 Message: "File or assembly name WorkFlow, or one of its dependencies, was not found." InnerException: Nothing TargetSite: {System.Reflection.RuntimeMethodInfo} StackTrace: " at System.EnterpriseServices.IRemoteDispatch.RemoteDispatchNotAutoDone(String s) at System.EnterpriseServices.RemoteServicedComponentProxy.Invoke(IMessage reqMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at TRENDSoft.WorkFlow.WFNode.setItem(String& iNID, Int32 iPID, String sName, String sTitle, String sDesc, Type iType, Attr eAttr, Int32 iRole, String sForm, Int32 iET, TimerType iEU, Int32 iWT, TimerType iWU) in C:\FC\WF\WorkFlow\WorkFlow\WFNode.vb:line 164 at TRENDSoft.Activity.wcSave_Click(Object sender, EventArgs e) in C:\FC\WF\flownet\flow\Activity.aspx.vb:line 171" HelpLink: "" Source: "mscorlib" HResult: -2147024894 ** CALL STACK ** > flownet.dll!TRENDSoft.Activity.wcSave_Click(Object sender = {System.Web.UI.WebControls.Button}, System.EventArgs e = {System.EventArgs}) Line 174 Basic system.web.dll!System.Web.UI.WebControls.Button::OnClick(System.EventArgs e = {System.EventArgs}) + 0x53 bytes system.web.dll!System.Web.UI.WebControls.Button::System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String* eventArgument = null) + 0x4e bytes system.web.dll!System.Web.UI.Page::RaisePostBackEvent(System.Web.UI.IPostBackEventHandler sourceControl = {System.Web.UI.WebControls.Button}, String* eventArgument = null) + 0x1e bytes system.web.dll!System.Web.UI.Page::RaisePostBackEvent(System.Collections.Specialized.NameValueCollection postData = {System.Web.HttpValueCollection}) + 0x3a bytes system.web.dll!System.Web.UI.Page::ProcessRequestMain() + 0x4f0 bytes system.web.dll!System.Web.UI.Page::ProcessRequest() + 0x76 bytes system.web.dll!System.Web.UI.Page::ProcessRequest(System.Web.HttpContext context) + 0x13 bytes system.web.dll!CallHandlerExecutionStep::Execute() + 0xb4 bytes system.web.dll!System.Web.HttpApplication::ExecuteStep(System.Web.HttpApplication.IExecutionStep step, bool completedSynchronously) + 0x58 bytes system.web.dll!System.Web.HttpApplication::ResumeSteps(System.Exception error) + 0xf3 bytes system.web.dll!System.Web.HttpApplication::System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, System.Object extraData) + 0xe3 bytes system.web.dll!System.Web.HttpRuntime::ProcessRequestInternal(System.Web.HttpWorkerRequest wr) + 0x1e0 bytes system.web.dll!System.Web.HttpRuntime::ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x3d bytes system.web.dll!System.Web.Hosting.ISAPIRuntime::ProcessRequest(__int32 ecb, __int32 iWRType) + 0xb7 bytes |
| Francesco Castigliego |
Re: problema con parametri dei metodi
Problema risolto, effettivamente bisognava mettere il componente nella GAC, leggendo l'msdn avevo capito esattemente il contrario, ora nascono un'altra serie di problemi di tipo pratico, del genere come si fa a sviluppare e debuggare un componente registrato in GAC, però sono problemi inferiori, l'importante che i componenti ora girano.
grazie Raffaele e grazie Andrea. Grancesco |
| Andrea Bini [MS] |
Re: problema con parametri dei metodi
Prova a mettere Workflow.dll nella GAC (gautil /i workflow.dll)
Fammi sapere se cambia qualcosa Ciao Andrea Bini [MS] |
| Andrea Bini [MS] |
Re: problema con parametri dei metodi
ops.... volevo dire gacutil /i workflow.dll....
|