Как можно «закрепить» в памяти экземпляр класса, который содержит объект 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
уже находится в памяти, так что оба соединения указывают на один и тот же объект в памяти.