Logo UGIdotNET

Discussione 'problema con parametri dei metodi'

# Pubblicato il 12 mag 2003 10.22 - Rispondi
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
# Pubblicato il 12 mag 2003 23.28 - Rispondi
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.
# Pubblicato il 14 mag 2003 21.26 - Rispondi
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
# Pubblicato il 19 mag 2003 8.58 - Rispondi
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]
# Pubblicato il 15 mag 2003 0.24 - Rispondi
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.
# Pubblicato il 16 mag 2003 22.06 - Rispondi
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
# Pubblicato il 17 mag 2003 12.49 - Rispondi
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.
# Pubblicato il 18 mag 2003 19.19 - Rispondi
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
# Pubblicato il 19 mag 2003 9.48 - Rispondi
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]
# Pubblicato il 19 mag 2003 14.49 - Rispondi
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
# Pubblicato il 19 mag 2003 14.31 - Rispondi
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


# Pubblicato il 19 mag 2003 15.45 - Rispondi
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]
# Pubblicato il 19 mag 2003 17.03 - Rispondi
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




# Pubblicato il 25 mag 2003 11.48 - Rispondi
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
# Pubblicato il 19 mag 2003 17.57 - Rispondi
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]
# Pubblicato il 19 mag 2003 18.02 - Rispondi
Andrea Bini [MS]
Re: problema con parametri dei metodi
ops.... volevo dire gacutil /i workflow.dll....

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185