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
>

Reply via email to