Как прикрепить класс к памяти, которая содержит объект SqlConnection - PullRequest
0 голосов
/ 30 октября 2019

Как можно «закрепить» в памяти экземпляр класса, который содержит объект SqlConnection. Чтобы я мог воссоздать другой объект SqlConnection из IntPtr этого экземпляра, чтобы воссозданный SqlConnection также указывал на тот же объект SqlConnection. Так что это дало бы успех, если мы проверяем с

bool success = object.ReferenceEquals(conn, conn2);  

Я попробовал этот код, приведенный здесь, даже дав атрибут [StructLayout(LayoutKind.Sequential)], когда я где-то читал, что этот атрибут необходим для закрепления объекта класса.

[StructLayout(LayoutKind.Sequential)]  
public sealed class MyConnection
{
    private SqlConnection _con = null;

    public MyConnection(string oSqlServer,
        string oDatabase,
        string oUser,
        string oPassword,
        int oTimeOut = 20)
    {
        string connectionString = "Server=" + oSqlServer + ";" + "Database=" + oDatabase + ";" + "User=" + oUser + ";" + "Password=" + oPassword + ";" + "Trusted_Connection=false" + ";" + "Connection Timeout=" + oTimeOut + ";" + "Persist Security Info=False";
        _con = new SqlConnection(connectionString);
    }

    public void Open()
    {
        _con.Open();
    }
}

И я называю это с помощью этих строк

MyConnection conn = new MyConnection("SqlServer2014", "Database1", "User1", "Password1", 11);
GCHandle handle = GCHandle.Alloc(conn, GCHandleType.Pinned);
IntPtr ip = handle.AddrOfPinnedObject();

Затем используйте то же значение IntPtr, чтобы сделать это, и снова получить объект SqlConnection.

MyConnection conn2 = (GCHandle.FromIntPtr(ip).Target as MyConnection);

Так что и conn, и conn2 в основном указывают на один и тот же объект в памяти, так что это должно давать true

bool success = object.ReferenceEquals(conn, conn2); 

Класс должен быть закреплен. Но я получаю сообщение об ошибке

Объект содержит не примитивные или неблизкие данные.

, вероятно, из-за объекта SqlConnection. Но затем, если мы не хотим, чтобы экземпляр SqlConnection в памяти кучи изменил местоположение, потому что я беру AddrOfPinnedObject(), чтобы я мог получить GCHandle, используя тот же IntPtr, и воссоздать другой объект SqlConnection, который ПРОТИВОСТОЯНИЯ НАОДИН ЖЕ SqlConnection уже находится в памяти, так что оба соединения указывают на один и тот же объект в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...