2013-05-02 2 views
0

У меня есть .Net смарт-карта, и я использую C# для создания приложения для карт и приложения-хозяина. На самом деле смарт-карта выступает в качестве сервера в удаленной сети .Net.Исключение .NET remoting ArgumentOutOfRange

В смарт-карте, у меня есть удаленный объект (MyClass), и я удаленный вызов метода:

public int AddPerson (string name,string age) 

добавить некоторую информацию к этому объекту.

public class Myclass : MarshalByRefObject 
{ 


private string Text1; 
private string Text2; 
private int NoOfperson = 0 ; 
private person[] List = new person [6]; 


    public void setText1(string t) 
    { Text1= t; } 
    public void setText2(string t) 
    { Text2= t }   

    public string getText1() 
    { return Text1; } 
    public string getText1() 
    { return Text1; } 

    public int AddPerson (string name,string age) 
    { 
     person OBJ = new person(); 
     OBJ.Name = name; 
     OBJ.Age = age; 
     List[NoOfperson] = OBJ; 
     NoOfperson ++; 
     return NoOfperson - 1 ; //Index of current person   
     return 1 ; 
    } 
     public PersonStruct getPesrson(int index) 
    { 
     return PersonStruct.convertToStruct(List[index]); 

    } 
} 

людей Класс:

public class person 
{ 
    private string name; 
    private string age; 

    public string Age 
    { 
     get { return age; } 
     set { age = value; } 
    } 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    }} 

PersonStruct:

public struct PersonStruct 
    { 

    public string name; 
    public string age; 

    public static PersonStruct convertToStruct(person OBJ) 
    { 
     PersonStruct tmp = new PersonStruct();    
     tmp.name = OBJ.Name; 
     tmp.age = OBJ.Age; 
     return tmp; 




    } 

Чтобы получить каждый элемент человека массива, я в первую очередь преобразовать его структуру, потому что есть некоторые проблемы, когда я пытаюсь сериализация объект. В любом случае это метод:

public PersonStruct getPesrson(int index) 

Проблема возникает в этом методе, хотя они успешно хранятся в смарт-карте. Я получил ArgumentOutOfRange Exception с этими деталями:

Message 
Index and length must refer to a location within the string. 


TargetSite: 
Void HandleReturnMessage(System.Runtime.Remoting.Messaging.IMessage 
, System.Runtime.Remoting.Messaging.IMessage) 

ParamName: 
length 

Source: 
mscorlib 

StackTrace: 
Server stack trace: 
    at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, 
Boolean fAlwaysCopy) 
    at System.String.Substring(Int32 startIndex, Int32 length) 
    at SmartCard.Runtime.Remoting.a.A(Type , String& , IMessage) 
    at SmartCard.Runtime.Remoting.a.a(Type , String& , IMessage) 
    at SmartCard.Runtime.Remoting.a.a(Type , String& , IMessage) 
    at SmartCard.Runtime.Remoting.a.A(Type , Byte[] , IMessage) 
    at SmartCard.Runtime.Remoting.a.A(Type , Stream , IMessage) 
    at SmartCard.Runtime.Remoting.Channels.APDU.APDUClientFormatterSink.SyncProce 
ssMessage(IMessage msg) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage req 
Msg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgDa 
ta, Int32 type) 
    at medicalrecordApp.medicalrecord.getExamination(Int32 index) 
    at MyCompany.MyClientApp.MyClient.Main() in C:\Documents and Settings\User\My 
Documents\Visual Studio 2008\Projects\Client2\Client2\MyClient.cs:line 36 
+0

код вы предоставите не имеет ничего общего с исключением. Пожалуйста, разместите соответствующий код и укажите, при выполнении строки не выполняется. –

+0

Я обновил свой вопрос –

+0

@hum - какие проблемы возникают при сериализации объекта? Вы добавили атрибут Serializable? –

ответ

2

Это звучит, как вы используете SubString с индексом, который не существует в строке. Вам нужно будет убедиться, что ваша строка имеет достаточно символов, прежде чем использовать этот индекс.

Если это новый проект, посмотрите на WCF, а не удаляйте его, вам может показаться, что оно более подходит. Microsoft опубликовала следующую схему:

WCF

+0

Я не видел, как OP создает ArrayList, я видел его, используя массив типа Person. Также в чем проблема с .NET Remoting? Если OP ищет производительность, то .NET Remoting - это путь. Если бы это было то, что плохой microsoft заменил бы его WCF для межпроцессного общения. Вы видите, что WCF не подходит всем. – Marco

+0

Код обновлен, поэтому я обновляю свой ответ. Раньше код имел класс под названием Arraylist. Я, конечно, не думаю, что WCF подходит ко всему, далекому от него. Тем не менее, я действительно думаю, что WCF заменяет удаленный доступ. –

+0

Это, конечно, не для меня, но каждый имеет право на другое мнение. – Marco