Couple more notes (I thought providing fullname should have been sufficient
as well)
- if RemotableObject assembly is in GAC
- If I didn't provide the full name but just provide (typename,
assemblyname)
- WellKnownServiceTypeEntry would trow an exception
- Above would work fine if RemotableObject assembly is in the same folder as
Host

- Regardless RemotableObject assembly is in GAC OR in the same folder as
Host
- If I did provide the full name (typename, assemblyname version....) (which
normally is needed when using Assembly.Load() for any GAC assembly)
- WellKnownServiceTypeEntry would NOT trow an exception
- But when a client actullay called a method on the remote instance
(createinstance or GetObject creates the proxy successfully) the exception
is thrown

All along lead me to troubleshoot thinking the problem was on the client
side creation.



-----Original Message----- From: Rick Byers [mailto:[EMAIL PROTECTED] Sent: Friday, June 20, 2003 7:44 AM To: [EMAIL PROTECTED] Subject: Re: [ADVANCED-DOTNET] Remoting GAC


Very interesting! So the problem stems from the fact that when you supply a System.Type to the RegisterWellKnownService* methods, it doesn't use the full strong name of the type. Looking at the SSCLI, the source for WellKnownServiceTypeEntry( Type, ... ) does: AssemblyName = type.Module.Assembly.nGetSimpleName(); instead of using Assembly.FullName

As mentioned in that post, the obvious work around is to supply the full
name yourself to the constructor that takes a pair of strings instead of a
Type.  Can anyone comment on why this might be the case?  This seems like a
bug to me.

Rick

----- Original Message -----
From: "ayse ayse" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, June 19, 2003 6:31 PM
Subject: Re: Remoting GAC


> One last time. > I have found the exact problem posted below. > I have tested and that fixed my issue. it was on the server side. > http://www.dotnet247.com/247reference/msgs/29/148958.aspx > Thanks! > > > -----Original Message----- > From: "ayse ayse" <[EMAIL PROTECTED]> > > Sorry for the lengthy responses. > I think my problem is on the Server Host side. Actually the code works if I > keep the "MyRemotableObject" in the same folder as the Host app (client app > doesn't have a copy on the same folder except in GAC). > I am posting my host snippet again, so you don't have read all the way to > figure out what I was doing. > On this side I want to use typeinfo as string so I can avoid any dependency > to "MyRemotableObject" or an interface. > > >I have a generic Remoting Server Host application which registers my > >remotable object with the code below. > > > >IChannel chnl = new TcpServerChannel("MyRemoteServer", 8228); > > > >string typeinfo = "MyRemotableObject.FooObj, MyRemotableObject, > >Version=3.0.1.0, Culture=neutral, PublicKeyToken=034567812341234a" > > > >Type typ = Type.GetType(typeinfo); > >RemotingConfiguration.RegisterWellKnownServiceType(typ, "MyRemoteServer", > >WellKnownObjectMode.SingleCall); > >Above seems to work fine, no exception even when my remotable assembly is > in > >the GAC. My client can successfully connect if my remotable object is not > in > >GAC. > > > -----Original Message----- > From: "ayse ayse" <[EMAIL PROTECTED]> > Sent: Thursday, June 19, 2003 2:25 PM > To: 'Moderated discussion of advanced .NET topics.' > Subject: RE: [ADVANCED-DOTNET] Remoting GAC > > Rick, > > Thanks for looking up. > > >Instead of doing "typ = Type.GetType(typeinfo)" on the client, you probably > >just want "typ = > typeof(IMyinterface)". > > I prefered typeinfo since it is a string and allowed no prior knowledge > (this is a wrapper). But Interface would work as well. I have just tried > with the interface but still same exception below. > > >I don't see how putting the assembly in the GAC or not would make a > difference. > I didn't think so either, except GAC requires signature public key, > version... > > >Are you talking about the GAC on the server or on the client? > Both in GAC > > >Also, try looking at the fusion log (fuslogvw.exe) after the exception is > thrown for details of the problem. > Not much help there. Attached at the end. But interesting the Fusion log is > thrown for for the host application not Client. > > > > > System.IO.FileNotFoundException: File or assembly name RemotableTestObject, > or one of its dependencies, was not found. > File name: "RemotableTestObject" > > Server stack trace: > at System.Reflection.Assembly.nLoad(AssemblyName fileName, String > codeBase, Boolean isStringized, Evidence assemblySecurity, Boolean > throwOnFileNotFound, Assembly locationHint, StackCrawlMark& stackMark) > at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, > Boolean stringized, Evidence assemblySecurity, StackCrawlMark& stackMark) > at System.Reflection.Assembly.InternalLoad(String assemblyString, > Evidence assemblySecurity, StackCrawlMark& stackMark) > at System.Reflection.Assembly.Load(String assemblyString) > at System.Runtime.Remoting.RemotingConfigInfo.LoadType(String typeName, > String assemblyName) > at > System.Runtime.Remoting.RemotingConfigInfo.StartupWellKnownObject(String > asmName, String svrTypeName, String URI, WellKnownObjectMode mode, Boolean > fReplace) > at > System.Runtime.Remoting.RemotingConfigInfo.StartupWellKnownObject(String > URI) > at > System.Runtime.Remoting.RemotingConfigHandler.CreateWellKnownObject(String > uri) > at System.Runtime.Remoting.IdentityHolder.CasualResolveIdentity(String > uri) > at System.Runtime.Remoting.Messaging.MethodCall.ResolveType() > at System.Runtime.Remoting.Messaging.MethodCall.ResolveMethod(Boolean > bThrowIfNotResolved) > at System.Runtime.Remoting.Messaging.MethodCall..ctor(Object > handlerObject, BinaryMethodCallMessage smuggledMsg) > at > System.Runtime.Serialization.Formatters.Binary.BinaryMethodCall.ReadArray(Ob ject[] > callA, Object handlerObject) > at > System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(Head erHandler > handler, __BinaryParser serParser, Boolean fCheck, IMethodCallMessage > methodCallMessage) > at > System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(S tream > serializationStream, HeaderHandler handler, Boolean fCheck, > IMethodCallMessage methodCallMessage) > at > System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryRequestMessage (String > objectUri, Stream inputStream, Boolean bStrictBinding) > at > System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IS erverChannelSinkStack > sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream > requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, > Stream& responseStream) > > Exception rethrown at [0]: > at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage > reqMsg, IMessage retMsg) > at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& > msgData, Int32 type) > at RemotableTestObject.RemotableObject.Run() > at Class1.Main(String[] args) in S:\main\class1.cs:line 117 > > Fusion log follows: > === Pre-bind state information === > LOG: DisplayName = RemotableTestObject > (Partial) > LOG: Appbase = S:\bin\ > LOG: Initial PrivatePath = NULL > Calling assembly : (Unknown). > === > > LOG: Policy not being applied to reference at this time (private, custom, > partial, or location-based assembly bind). > LOG: Post-policy reference: RemotableTestObject > LOG: Attempting download of new URL file:///S:/bin/RemotableTestObject.DLL. > LOG: Attempting download of new URL > file:///S:/bin/RemotableTestObject/RemotableTestObject.DLL. > LOG: Attempting download of new URL file:///S:/bin/RemotableTestObject.EXE. > LOG: Attempting download of new URL > file:///S:/bin/RemotableTestObject/RemotableTestObject.EXE. > > > > > > FUSION LOG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > *** Assembly Binder Log Entry (6/19/2003 @ 2:10:10 PM) *** > > The operation failed. > Bind result: hr = 0x80070002. The system cannot find the file specified. > > Assembly manager loaded from: > C:\WINNT\Microsoft.NET\Framework\v1.0.3705\fusion.dll > Running under executable S:\bin\RemotingHostApp.exe > --- A detailed error log follows. > > === Pre-bind state information === > LOG: DisplayName = RemotableTestObject > (Partial) > LOG: Appbase = S:\bin\ > LOG: Initial PrivatePath = NULL > LOG: Dynamic Base = NULL > LOG: Cache Base = NULL > LOG: AppName = NULL > Calling assembly : (Unknown). > === > > LOG: Processing DEVPATH. > LOG: DEVPATH is not set. Falling through to regular bind. > LOG: Policy not being applied to reference at this time (private, custom, > partial, or location-based assembly bind). > LOG: Post-policy reference: RemotableTestObject > LOG: Attempting download of new URL file:///S:/bin/RemotableTestObject.DLL. > LOG: Attempting download of new URL > file:///S:/bin/RemotableTestObject/RemotableTestObject.DLL. > LOG: Attempting download of new URL file:///S:/bin/RemotableTestObject.EXE. > LOG: Attempting download of new URL > file:///S:/bin/RemotableTestObject/RemotableTestObject.EXE. > LOG: All probing URLs attempted and failed. > > > -----Original Message----- > From: Rick Byers [mailto:[EMAIL PROTECTED] > Sent: Thursday, June 19, 2003 12:36 PM > To: [EMAIL PROTECTED] > Subject: Re: [ADVANCED-DOTNET] Remoting GAC > > > On the client, if you're going to use 'Connect' to access your remote object > (as opposed to 'new MyRemotableObject'), then you can access it using an > interface (which you appear to want to do anyway). Instead of doing "typ = > Type.GetType(typeinfo)" on the client, you probably just want "typ = > typeof(IMyinterface)". I assume that RemotableObject implements > IMyinterface (since thats what you're casting the proxy to on the client), > right? By connecting using the interface type, you're requiring only the > interface assembly (not the implementation) to be present on your client. > > I don't see how putting the assembly in the GAC or not would make a > difference. Are you talking about the GAC on the server or on the client? > Also, try looking at the fusion log (fuslogvw.exe) after the exception is > thrown for details of the problem. > > Rick > > ----- Original Message ----- > From: "ayse ayse" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Thursday, June 19, 2003 1:24 PM > Subject: Re: Remoting GAC > > > >I am having a bit of a trouble with remoting assemblies from GAC. > > > >I need to support remoting regardless if my remotable object is in the > GAC. > >All the code below works fine if I don't use GAC! > > > >I have a generic Remoting Server Host application which registers my > >remotable object with the code below. > > > >IChannel chnl = new TcpServerChannel("MyRemoteServer", 8228); > > > >string typeinfo = "MyRemotableObject.FooObj, MyRemotableObject, > >Version=3.0.1.0, Culture=neutral, PublicKeyToken=034567812341234a" > > > >Type typ = Type.GetType(typeinfo); > >RemotingConfiguration.RegisterWellKnownServiceType(typ, "MyRemoteServer", > >WellKnownObjectMode.SingleCall); > >Above seems to work fine, no exception even when my remotable assembly is > in > >the GAC. My client can successfully connect if my remotable object is not > in > >GAC. > > > >My client: > > > >string uri = "tcp://MyRemotemachine:8228/MyRemoteServer"; > >string typeinfo = "MyRemotableObject.FooObj, MyRemotableObject, > >Version=3.0.1.0, Culture=neutral, PublicKeyToken=034567812341234a" > > > >IChannel chnl = new TcpClientChannel(); > >Type typ = Type.GetType(typeinfo); > > > >IMyinterface rem_o = (IMyinterface)RemotingServices.Connect(typ, uri); > > > >This creates the proxy and works fine if RemotableObject is not in GAC. > But > >if in GAC throws "System.IO.FileNotFound" with "either the assemebly... or > >one of it's dependencies not found" exception as soon as I call a method > >even rem_o.ToString(). > > > > > >MyRemotableObject: > >public class RemotableObject:MarshalByRefObject > > { > > public RemotableObject() > > .... > > > > } > > > >Any quick catches or suggestions? I don't want to use App.config and > >activate programmaticaly allowing my clients to create a remote or local > >instance as they choose. > >Thanks. > > > >_________________________________________________________________ > >Protect your PC - get McAfee.com VirusScan Online > >http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963 > > > > > > > This message was scanned for viruses. > > _________________________________________________________________ > Tired of spam? Get advanced junk mail protection with MSN 8. > http://join.msn.com/?page=features/junkmail >




This message was scanned for viruses.





_________________________________________________________________ The new MSN 8: advanced junk mail protection and 2 months FREE* http://join.msn.com/?page=features/junkmail

Reply via email to