Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 2
07.11.2017, 10:57  [ТС] 1
Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Написал библиотеку для интеграции в другое приложение (не офис) через VBA. Библиотека производит сериализацию некоего объекта (экземпляр класса Security, который, в свою очередь, содержит в себе 2 списка List из объектов классов Users и Groups).

При подключении этой библиотеки к c# проекту все работает отлично - и сериализация, и десериализация. Если же работаю с ней из VBA - на стадии десериализации вылетала ошибка "Runtime error Не удалось найти сборку "MySecLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"".

Погуглив, попробовал исправить это, используя для BinaryFormatter кастомный Binder, после чего ошибка изменилась на "Runtime error Не удалось загрузить тип System.Collections.Generic.List'1[[MySecLib.Users, MySecLib, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]], необходимый для десериализации."

Насколько я понимаю, необходимо каким-то образом включать ссылки на классы всех входящих в сериализацию объектов и в стороннем приложении с vba. Так ли это? И как это сделать? Создавать библиотеки из одного класса и каждую из них кидать в References? Есть у кого-нибудь идеи?

Main.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
//using System.Runtime.Serialization;
//using System.Reflection;
 
namespace MySecLib
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("B33753D2-6A1A-4E1E-AC31-CA4B18E8178D")]
    [ProgId("MySecLib.Security")]
    [ComDefaultInterface(typeof(ISecurityClass))]
    public class Security : ISecurityClass
    {
        public static List<Users> users = new List<Users>();
        public static List<Groups> groups = new List<Groups>();
        public static SecurityObject securityObject;
        #region ISecurityClass Members
        public void AddGroup(string _name)
        {
            groups.Add(new Groups(_name));
        }
        public void AddUser(string _name, string _password, Groups _group)
        {
            users.Add(new Users(_name, _password, _group));
        }
        public string GetLoggedInUserName()
        {
            return users[0].name;
        }
        public string GetLoggedInUserGroupName()
        {
            return groups[0].name;
        }
        public Groups GetGroup()
        {
            return groups[0];
        }
        public void Save()
        {
            securityObject = new SecurityObject(users, groups);
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream fs = new FileStream("Security.dat", FileMode.OpenOrCreate))
            {
                formatter.Serialize(fs, securityObject);
            }
        }
        public void Read()
        {
 
            BinaryFormatter formatter = new BinaryFormatter();
            //formatter.Binder = new CustomBinder();
            using (FileStream fs = new FileStream("Security.dat", FileMode.OpenOrCreate))
            {
                securityObject = (SecurityObject)formatter.Deserialize(fs);
                users = securityObject.users;
                groups = securityObject.groups;
            }
        }
        #endregion
 
    }
    //public class CustomBinder : SerializationBinder
    //{
    //    public override Type BindToType(string assemblyName, string typeName)
    //    {
    //        Assembly currentasm = Assembly.GetExecutingAssembly();
 
    //        return Type.GetType($"{currentasm.GetName().Name}.{typeName.Split('.')[1]}");
    //    }
    //}
}
SecurityObject.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MySecLib
{
    [Serializable]
    public class SecurityObject
    {
        public List<Users> users;
        public List<Groups> groups;
 
        public SecurityObject(List<Users> _users, List<Groups> _groups)
        {
            users = _users;
            groups = _groups;
        }
 
    }
}
ISecurityClass.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace MySecLib
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [Guid("1F671EFD-C337-422C-9195-07305C36CE0A")]
    public interface ISecurityClass
    {
        void AddGroup(string _name);
        void AddUser(string _name, string _password, Groups _group);
        string GetLoggedInUserName();
        string GetLoggedInUserGroupName();
        Groups GetGroup();
        void Save();
        void Read();
    }
}
Users.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MySecLib
{
    [Serializable]
    public class Users
    {
        public string name, password;
        Groups group;
 
        public Users(string _name, string _password, Groups _group)
        {
            name = _name;
            password = _password;
            group = _group;
        }
    }
}
Groups.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MySecLib
{
    [Serializable]
    public class Groups
    {
        public string name;
        public Groups(string _name)
        {
            name = _name;
        }
    }
}
0
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,705
07.11.2017, 20:49 2
Цитата Сообщение от rainer048 Посмотреть сообщение
И как это сделать?
Попробуйте дать вашей сборке строгое имя и засунуть в GAC.
1
98 / 1 / 1
Регистрация: 28.01.2007
Сообщений: 53
08.11.2017, 12:17 3
Если вы хотите динамически добалять новые классы в вашу сериализацию, создайте конфиг, в котором
укажите имя типа например MySecLib.Users и имя сборки в которой он реализован, при инициализации класса Sequrity
считывайте и грузите соответсвующие сборки через Assembly.Load

Вариант номер два, самый надежный и на мой взгляд правильный, используйте xml для сериализации ваших объектов
и прарсите его в приложении vba.
1
0 / 0 / 0
Регистрация: 06.04.2017
Сообщений: 2
19.11.2017, 12:27  [ТС] 4
IamRain, спасибо, это работает!

В таком случае, еще вопрос: использую версию VS без InstallShield, соответственно, не могу автоматически при установке закидывать сборку в GAC. Как это сделать на ПК без установленной VS, а значит и gacutil? Или можно банально скопировать gacutil на конечный ПК и через командную строку добавить сборку?
0
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,705
19.11.2017, 12:37 5
Насколько я помню, вариант с копированием gacutil на целевую машину должен работать.
+ Также можно программно установить сборку в GAC с использованием System.enterpriseservices.internal.publish class.
1
19.11.2017, 12:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2017, 12:37
Помогаю со студенческими работами здесь

Сериализация Region для записи в БД
Как сериализовать Region? Т.е. нужно сериализовать, чтобы записать в BLOB-поле БД

Для чего нужна сериализация?
из msdn Сериализация представляет собой процесс преобразования объекта в поток байтов для...

Что нужно для написания приложения для Facebook (библиотека для Visual Studio)
Здравствуйте! Нашел интересную статейку на офсайте посвящённому asp.net , где представлен...

Хранение(сериализация) данных для программы
Доброго времени суток. В чём лучше всего хранить данные?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru