question about C# (remoting)

User avatar
andys
Уже с Приветом
Posts: 234
Joined: 30 Nov 1999 10:01
Location: Omsk, Russia->Norwalk, CT->Detroit, MI, ->Bethel CT, -> Cary NC USA

question about C# (remoting)

Post by andys »

Имею Remotable Business Object (MarshalByRef, server activated, singlecall) который дергает Data Object (static, not remotable) и получает Dataset.

Проблема - что я сделал не так что при попытке вызова DataObject клиент требует копию DataObject.dll ... иначе не работает :(( что не так?

код примерно такой...
Business: - References: DataObject, System.Data и так далее...

public class BusinessObject : MarshalByRefObject {
public TypeDataSet GetTypedDataSet(...){
DataSet ds = DataObject.GetDataSet(...);
TypedDataSet TDS = new TypedDataSet ();
TDS.Merge(ds,false, System.Data.MissingSchemaAction.Ignore);
return ds;
}}

DataObject - References: System.Data и так далее...

public class DataObject{
public static DataSet GetDataSet(...){
... получаем DataSet...
}}

Client - References: BusinessObject, System.Data и так далее...
....
public void GetSomeThing(...)
BusinessObject BO = new BusinessObject();
TypeDataSet ds = BO.GetTypedDataSet(...){...}
....
Client вызывает remote BusinessObject (Wellknown, singlecall).

Схема на TypedDataSet описана в BusinessObject-е
================================
RGDS,Andy
================================
User avatar
Gennadiy
Уже с Приветом
Posts: 11332
Joined: 30 Mar 2000 10:01
Location: Ice Storm Town

Post by Gennadiy »

До конца детали не ясны, но возможно соединение с удаленным сервером не может иницилализироватся (по какой либо причине - скорее всего неправильная конфигурация) и слиент пытается создать не удаленный а локальный вариант BusinessObject (он будет делать это по умолчание всегда когда нет связи и вы вызываете new), который и пытается загрузить DataObject.
Вообще не очень привычный дизайн. Обычно если вы работаете с SAO, то логичнее работать с интерфейсами а не с классами. Классы обычно используют с CAO.
Sergei VP
Новичок
Posts: 44
Joined: 21 Mar 2003 12:44

Post by Sergei VP »

Вы очевидно устанавливаете DLL с вашим BusinessObject на клиентскую машину, а при загрузке она тянет другие модули на которые ссылается (DataObject.dll). Т.е. нужно на клиента поставить и их, что выглядет не очень красиво.
Чтобы не устанавливать серверные модули на клиента нужно обеспечить развязку. Для этого можно сделать сборку с таким же именем файла, strong name (если есть) и версией как у вашей серверной сборки (BusinessObject.dll) и определить в ней класс с таким же именем (BusinessObject), методы этого класса могут быть пустыми, т.к. вызываться они всё-равно не будут (это не относится к статическим методам!!!).

public class BusinessObject : MarshalByRefObject {
public TypeDataSet GetTypedDataSet(...){
return null;
}}

И конечно же эта сборка не должна ссылатся на другие серверные компаненты: DataObject.dll и др.. Вот именно с ней и дожен работать клиент. Хоть это способ и не рекомендуют, он реально работает.
User avatar
andys
Уже с Приветом
Posts: 234
Joined: 30 Nov 1999 10:01
Location: Omsk, Russia->Norwalk, CT->Detroit, MI, ->Bethel CT, -> Cary NC USA

Post by andys »

Thankx, all, problem solved!
================================
RGDS,Andy
================================

Return to “Вопросы и новости IT”