Ik heb het volgende geprobeerd en loop tegen problemen aan:
- genereer een nieuw keypair met 'sn -n keypair.dat'
- haal de public key eruit met 'sn -p public.snk'
- maak een tekstversie met 'sn -tp public.snk > public.txt'
Ik heb nu keypair.dat (keypair file), public.snk (public key file) en public.txt waarin dit staat:
Code:
Microsoft (R) .NET Framework Strong Name Utility Version 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
Public key is
00240000048000009400000006020000002400005253413100040000010001001750f37c97de0a
d8caca86e408a3cf7139d2d78a72ccb4c02a8d48d3c9739472b11e69e7c03564ff6245d69026e3
96892cecc6abcae4df50a3186fedc9e5c49a791219571aaae31df2584088946879425b7d756796
e33ba1b4e7d099e5f4756f1c54310804b09f3fc2653514693e0674d4ddc6b2bb694571377a1871
1356d7b0
Public key token is e11247b809200e1e
Ik doe nu dit in Delphi 2005:
- bouw een nieuw package met een nieuwe unit
- in de unit definieer ik een interface IMyClass met als enig member een method Test
- bouw een nieuwe applicatie, die het package referenced, met een unit waarin TMyClass gedefinieerd wordt, met een werkende implementatie van Test
De definitie van TMyClass:
Code:
[StrongNameIdentityPermissionAttribute
(SecurityAction.LinkDemand,
PublicKey=
'00240000048000009400000006020000002400005253413100040000010001001750f37c97de0a'+
'd8caca86e408a3cf7139d2d78a72ccb4c02a8d48d3c9739472b11e69e7c03564ff6245d69026e3'+
'96892cecc6abcae4df50a3186fedc9e5c49a791219571aaae31df2584088946879425b7d756796'+
'e33ba1b4e7d099e5f4756f1c54310804b09f3fc2653514693e0674d4ddc6b2bb694571377a1871'+
'1356d7b0',
Name='ClientApp',
Version='1.0.0.0')]
TMyClass = class (MarshalByRefObject, interfaces.IMyClass)
private
public
procedure Test;
end;
Als ik e.e.a. goed begrijp beperk ik daarmee toegang tot de klasse tot toepassingen die 'ClientApp' heten, versie 1.0.0.0 en die signed zijn m.b.v. het keypair dat bij bovengenoemde public key hoort.
Met remoting maak ik de klasse beschikbaar vanuit de server applicatie:
Code:
var
aChannel: TcpServerChannel;
begin
aChannel := TcpServerChannel.Create(6601);
ChannelServices.RegisterChannel(aChannel);
RemotingConfiguration.RegisterWellKnownServiceType(
TypeOf(TMyClass), 'myclass', WellKnownObjectMode.Singleton);
end;
Dan maak ik die client applicatie die erbij zou moeten kunnen:
- bouw een nieuwe applicatie ClientApp
- benader het object met remoting
- voer Test methode uit
In de source van het project van de ClientApp staat:
Code:
[assembly: AssemblyTitle('ClientApp')]
[assembly: AssemblyVersion('1.0.0.0')]
[assembly: AssemblyKeyFile('keypair.snk')]
Alles compileert prima, de server runt (met voor de zekerheid ook een vrijelijk beschikbare klasse die prima werkt), de client kan bij de server, maar dan krijg ik de volgende fout:
Request for the permission of type System.Security.Permissions.StrongNameIdentityPerm ission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 failed.
Wat me opvalt is het versienummer en het niet kloppende PublicKeyToken, maar dat lijkt te slaan op mscorlib... Wat doe ik fout?
Alvast bedankt voor het meedenken,
JAAP.
Bookmarks