Bu makalede, özel Sıralayıcı gerekli olduğu içerik anlatılır. Bu makalede, iki farklı senaryolarda sağlar.
Senaryo 1Ilk senaryoda, .NET istemciden gelen COM sunucusu için özel sıralama anlatılır. Bu senaryoda, sahip olmalısınız:
- IUnmanagedServer uygulayan BIR COM sunucusu arabirimi.
- UnmanagedServerMethod adlı tek bir yönteme sahip IUnmanagedServer. Bu yöntem, giriş olarak tek bir parametre türü IUnmanaged gerektirir.
- Bir kopyasını içeren BIR .NET istemci IManaged yazın.
- The UnmanagedServerMethod COM sunucusu için IManaged örneği geçirmeden .NET istemci.
Aşağıdaki kod örneği, bir alıntı, IUnmanaged olan arabirim:
interface IUnmanaged : IUnknown
{
HRESULT UnmanagedMethod([out, retval] LONG *RetVal);
}; semantically yönetilmeyen arabirimi (IUnmanaged) benzer yönetilen bir arabirim (IManaged):
public interface IManaged
{
long ManagedMethod();
} Senaryo 2Ikinci senaryoda, özel bir COM istemciden bir .NET sunucusuna dizme anlatılır. Bu senaryoda, sahip olmalısınız:
- ManagedServerMethod adlı tek bir yöntem uygulayan BIR .NET sunucusuna. Bu yöntem, giriş olarak tek bir parametre türü IManaged gerektirir.
- Bir kopyası olan BIR COM istemcisi IUnmanaged yazın.
- The ManagedServerMethod .NET sunucusunun için IUnmanaged örneği geçirmeden COM istemcisi.
Semantically benzer değişik eşlemek çalıştığınızda bir sarmalayıcı sınıf oluşturmanız gerekir. Bir sarmalayıcı sınıf türü örneği içerir, ancak başka bir türle arabirimi sunar. Sarmalayıcı sınıf arabirimleri için tanımlanan semantiği koruyabilirsiniz, eşlenen türleri, benzer olmalıdır. Bu makalede, .NET istemci, COM sunucusu burada eriştiği senaryosu için bir sarmalayıcı sınıf kullanmayı açıklamaktadır. ManagedIUnmanaged adlı BIR sarmalayıcı sınıf örneği IManaged sarar ancak IUnmanaged arabirimi sunar.
Benzer şekilde, COM istemci .NET sunucusuna eriştiği zaman ComUnmanged adlı bir sarmalayıcı sınıf örneğini IUnmanaged sarar ancak IManaged arabirimi sunar.
Bir yönetilen arabirimi yönetilmeyen bir arabirim için eşleme sorun çözümü vardır. Sarmalayıcı sınıfları çözümü kullanmaktır. Özel Sıralayıcı otomatikleştirir ve sarmalayıcı umanaged yönetilen etki alanı ve bunun tersi sıralanmış türünün oluşturulduğunda gizler.
Akış sınıfı ve ıstream COM arabirimi bakın. Dönüştürme düzenekleri gereken görebilirsiniz. Dönüştürme düzenekleri yönetilmeyen bir kapsayıcı nesnesine eşlenmelidir belirli bir arabirimi gereksinimleri uygulamak için nesne izin verir. Bu kapsayıcı nesne daha sonra farklı bir arabirim kümesi sunar. .NET
Akış sınıfı semantically ıstream COM arabirimi için benzer iş.
Akış sınıfı ve ıstream COM arabirimi sağlanan oluşumlarını benzer. Istream hem
Akış, okuma, yazma ve bir arabellek arama izin verir. <a0>
Akış</a0> sınıfının bir örneği götüren BIR .NET sınıfı, mantıksal olarak ıstream arabirimini uygulayan bir COM nesnesinin bir kopyas?n? geçirilebilir. Bunu yapmak için <a0></a0>, .NET Framework <a0>
Akış</a0> sınıfının bir kapsayıcı nesnesi oluşturulabilir bir düzenek sağlamanız gerekir. Bu katıştırılmış
ıstream COM nesnesini çağıran
Akış sınıf yöntemi yönlendirir. Dönüştürme yapılmasına olanak sağlayan bir mekanizma sağlayan .NET Framework
CustomMarshaler sınıftır.
Her iki senaryolarda özel Sıralayıcı dizme gerçekleştirildiğini yönüne bağlı olarak oluşturulur. Dizme yerel bir istemciden bir yönetilen sunucuya gerçekleştirilirse, yalnızca yönetilen etki yerel sıralamakta özel bir sıralayıcı tanımlamanız gerekir. Daha sonra her iki yönde de özel sıralama sıralanmış, her iki senaryolarda anlatıldığı şekilde özel Sıralayıcı tanımını birleştirmeniz gerekir.
Back to the topBir COM sunucu için özel bir .NET istemciden sıralaması
ATL bir COM sunucusu oluşturmak için gereken adımları
Bu bölüm, IUnmanagedServer arabirimini uygulayan bir ATL COM sunucusu oluşturulması gösterilmiştir.
- Microsoft Visual Studio. NET'i açın.
- Dosya menüsünden Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
- Yeni proje) iletişim kutusunda, Project Types altında Visual C++ Projects ' ı tıklatın ve ardından ATL Projectşablonları altında.
- Ad metin kutusuna ComServer yazın.
- Tamam ' ı tıklatın.
- Sihirbazı iletişim kutusunda, Uygulama ayarları</a0> sekmesini tıklatın.
- <a0>Attributed</a0> onay kutusunu temizleyin ve sonra da <a2>son</a2>'ı tıklatın, bu seçeneği tıklatın.
- Solution ExplorerComServer (Proje) düğümünü sağ tıklatın, sonra da Ekle işaret ve Add Class</a1>'ı tıklatın.
- Add Class iletişim kutusunda, şablon altında ATL Basit Nesne ' ı tıklatın ve sonra Aç ' ı tıklatın.
- ATL Basit Nesne Sihirbazı iletişim kutusunda, UnmanagedServerkısa ad) metin kutusuna yazın ve sonra da <a2>son</a2>'u tıklatın.
- Solution Explorer, Source Files ' ı genişletin.
- ComServer.idl .idl bir düzenleyicisinde açmak için çift tıklatın. Aşağıdaki arabirim tanımına .idl dosyayı. Ekle
[
object,
uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
helpstring("IUnmanaged Interface"),
pointer_default(unique)
]
interface IUnmanaged : IUnknown
{
HRESULT UnmanagedMethod([out, retval] LONG *RetVal);
}; guidgen aracından oluşturulan GUID ile uuid özniteliği içeriğini değiştir. Kitaplıkta, IUnmanaged arabirimi, önceki kodda gösterildiği gibi ekleyin. Bu arabirimi aracılığıyla oluşturulan tür kitaplığını kullanır. Kitaplık ifadeye .idl dosyasındaki aşağıdaki kodu ekleyin:
library ComServerLib
{
importlib("stdole2.tlb");
//Add the following line to the idl file.
interface IUnmanaged;
...
};
- Sınıf görünümünde ComServer genişletin.
- Ekle işaret IUnmanagedServer sağ tıklatın ve Yöntem Ekle</a1>'ı tıklatın.
- Yöntem adı metin kutusuna UnmanagedServerMethod yazın.
- Onay kutusu Parameter öznitelikleri seçmek için tıklatın.
- Parametre türü açılan kutuda IUnmanaged * yazın.
- Parameter metin kutusuna yönetilmeyen yazın ve sonra Ekle ' yi tıklatın.
- Son ' u tıklatın.
- Solution ExplorerUnmanagedServer.cpp çift tıklatın.
- Izleyen koduyla CUnmanagedServer::UnmanagedServerMethod yöntemi için oluşturulan varsayılan kodunu değiştir:
LONG data;
HRESULT hr;
hr = unmanaged->UnmanagedMethod(&data);
if(FAILED(hr))
return hr;
printf("The output of the IUnmanaged::UnmanagedMethod is : %d", data);
return S_OK; - Yapı) menüsünde tıklatın Build Solution ATL COM sunucu uygulaması oluşturmak için.
Back to the
topBir .NET istemci oluşturmak için gereken adımları
Bu bölüm, COM sunucusu erişir ve ardından IManaged örneği sunucuyla
UnmanagedMethod geçirmeden .NET istemci oluşturulması gösterilmiştir:
- Dosya menüsünden Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
- Yeni proje) iletişim kutusunda, Project Types altında Visual C# Projects ' ı tıklatın ve şablonları altında Console Application ' ı tıklatın.
- Solution Ekle seçeneğini seçin ve Tamam ' ı tıklatın, bu seçeneği tıklatın.
- Solution ExplorerConsoleApplication1 genişletin, Başvurular ' ı sağ tıklatın ve Add Reference</a1>'ı tıklatın.
- Başvuru Ekle iletişim kutusunda, COM</a0> sekmesini tıklatın.
- Bileşen adı altında ComServer 1.0 tür kitaplığı ' nı tıklatın ve sonra da <a2>Seç</a2>'i tıklatın.
- Tamam ' ı tıklatın.
- Class1.cs varsayılan kodu aşağıdaki kodla değiştirin:
using System;
using System.Runtime.InteropServices;
public interface IManaged
{
long ManagedMethod();
}
public class ManagedImplementation : IManaged
{
public long ManagedMethod()
{
return 200;
}
}
class Class1
{
static void Main(string[] args)
{
comserverLib.IUnmanagedServer server = new comserverLib.UnmanagedServerClass();
IManaged managed = new ManagedImplementation();
server.UnmanagedServerMethod(managed);
}
}
Back to the
topBir Wrapper oluşturma adımları
Bu bölüm, bir sarmalayıcı sınıf IManaged türünün bir örneği sarar ancak IUnmanaged arabirimi sunar oluşturulması gösterilmiştir.
Sarmalayıcı sınıf oluşturmak için <a0></a0>, aşağıdaki adımları izleyin:
- Class1.cs için aşağıdaki kodu ekleyin:
[
ComImport,
Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)
]
public interface UCOMIUnmanaged
{
long UnmanagedMethod();
}
public class ManagedIUnmanaged : UCOMIUnmanaged
{
IManaged managedObj;
public ManagedIUnmanaged(IManaged managedObj)
{
if(managedObj != null)
this.managedObj = managedObj;
else
throw new ArgumentNullException("The instance of IManaged is null.");
}
public long UnmanagedMethod()
{
return managedObj.ManagedMethod();
}
}
uuid özniteliği içeriğiyle GUID özniteliği içeriğini değiştir. Uuid özniteliği ComServer.idl dosyasındaki IUnmanaged arabirim için oluşturulur.
Back to the
topÖzel bir sıralayıcı oluşturmak için gereken adımları
Bu bölüm, bir yönetilen (IManaged) arabirimi yönetilmeyen bir arabirim (IUnmanaged) eşleştiren özel bir sıralayıcı oluşturulması gösterilmiştir:
Özel sıralayıcısı ıcustommarshaler arabirimini uygulamalıdır. Yönetilmeyen bir arabirim için yönetilen bir arabirim eşleştirilmiş
MarshalNativeToManaged yöntemi denir. Geçerli senaryosu için yerel etki alanı yönetilen s?ralar çünkü
MarshalNativeToManaged yönteminin geçerli uygulama boş olarak döndürür.
MarshalManagedToNative yöntemi, önceki bölümde tanımlanan bir kapsayıcı nesnesinde (
ManagedIUnmanaged) yerel nesne kaydırılır. Bir yönetilen arabirimi yönetilmeyen bir arabirim eşleştirilmiş
MarshalManagedToNative yöntemi denir. Yerel arabirim ile ilişkili olan nesne yayımlandığında
CleanUpNativeData yöntemi olarak adlandırılır.
Benzer şekilde, yönetilen bir arabirimle ilişkili nesne serbest
CleanUpManagedData yöntemi denir. Yönetilen Nesne çöp toplama) olduğundan, uygulama
CleanUpManagedData yöntemi için boştur.
GetNativeDataSize yöntemi,
-1 döndürür.
Getınstance yöntemi ıcustommarshaler arabirimini için tanımlı değil de, bir kopyasını bir
ıcustommarshaler döndüren
Getınstance statik yöntem tanımlamalısınız. Bu statik yöntem, özel Sıralayıcı örneğini oluşturmak için .NET çalışma zamanı tarafından verilir.
- Add the code that follows to Class1.cs:
public class SampleMarshaler : ICustomMarshaler
{
static SampleMarshaler marshaler;
public object MarshalNativeToManaged(IntPtr pNativeData)
{
return null;
}
public IntPtr MarshalManagedToNative(object managedObj)
{
if(managedObj == null)
return IntPtr.Zero;
if(!(managedObj is IManaged))
throw new MarshalDirectiveException("This custom marshaler must be used on a IManaged derived type.");
ManagedIUnmanaged customObject = new ManagedIUnmanaged((IManaged)managedObj);
return Marshal.GetComInterfaceForObject(customObject, typeof(UCOMIUnmanaged));
}
public void CleanUpNativeData(IntPtr pNativeData)
{
Marshal.Release(pNativeData);
}
public void CleanUpManagedData(object managedObj)
{
}
public int GetNativeDataSize()
{
return -1;
}
public static ICustomMarshaler GetInstance(string cookie)
{
if(marshaler == null)
return marshaler = new SampleMarshaler();
return marshaler;
}
} - Özel Sıralayıcı IUnmanaged arabirimin örneği IManaged arabirimi örneği sıralama ile ilişkilendirin. Class1.cs özel Sıralayıcı ilişkilendirmek için aşağıdaki kodu ekleyin:
[
ComImport,
Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)
]
public interface UCOMIUnmanagedServer
{
void UnmanagedServerMethod(
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(SampleMarshaler)), In]
object unmanaged);
} The GUID GUID özniteliği ile belirtmek için COM sunucusu .idl IUnmanagedServer arabiriminde belirtilen uuid özniteliği ile aynıdır. - Class1 Class1.cs, <a1>ana</a1> yöntemini şu şekilde değiştirin:
static void Main(string[] args)
{
UCOMIUnmanagedServer server = (UCOMIUnmanagedServer)new ComServerLib.UnmanagedServerClass();
IManaged managed = new ManagedImplementation();
server.UnmanagedServerMethod(managed);
} yönetilmeyen istemci yönetilmeyen sunucunun çağrı sırasında yönetilmeyen istemci yönetilen bir nesne örneği yönetilmeyen sunucuya geçirmeden. Yönetilen nesneye yönetilmeyen arabirimi COM sunucu tarafından beklendiği gibi gösterir sıralanmış özel nesnedir. - Yapı) menüsünde tıklatın Build Solution.
- Solution ExplorerConsoleApplication1 proje düğümünü sağ tıklatın ve sonra da <a2>Başlangıç proje olarak ayarla</a2>'ı tıklatın.
- Hata Ayıkla) menüsünde, Başlat ' ı tıklatın.
Back to the
topÖzel bir COM istemcisi'nden bir .NET sunucusuna sıralaması
Aşağıdaki gösterdiğine dikkat ne özel sıralama senaryosunda, bir COM istemciden bir .NET sunucusuna gerçekleştirilir.
Bir COM istemci oluşturmak için gereken adımları
Bu bölüm IManaged arabirimini uygulayan bir ATL COM bileşeni oluşturmak gösterilmiştir:
- Dosya menüsünden Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
- Visual C++ ProjectsProject Types altında tıklatın ve ardından ATL Projectşablonları altında.
- Adı metin kutusuna, ComComponent yazın ve Tamam'ı tıklatın.
- ATL Project Sihirbazı iletişim kutusunda, Uygulama ayarları</a0> sekmesini tıklatın.
- <a0>Attributed</a0> onay kutusunu temizleyin ve sonra da <a2>son</a2>'ı tıklatın, bu seçeneği tıklatın.
- Solution ExplorerComComponent (Proje) sağ tıklatın, sonra da Ekle işaret ve Add Class</a1>'ı tıklatın.
- Add Class iletişim kutusunda, şablon altında ATL Basit Nesne ' ı tıklatın ve sonra Aç ' ı tıklatın.
- ATL Basit Nesne Sihirbazı iletişim kutusunda Yönetilemeyenkısa bir ad yazın... metin kutusunu ve sonra da <a2>son</a2>'u tıklatın.
- Sınıf görünüm, ComComponent genişletin, IUnmanaged sağ tıklatın, Ekle işaret ve Yöntem Ekle</a1>'ı tıklatın.
- Ekleme yöntemi Sihirbazı iletişim kutusunda, UnmanagedMethodYöntem adı metin kutusuna yazın.
- LONG *parametre türü altında listeden seçin.
- RetvalParameter öznitelikleri altında seçin ve sonra lRetVal, parametre adı metin kutusuna yazın, bu seçeneği tıklatın.
- Ekle ' yi tıklatın ve sonra da <a2>son</a2>'u tıklatın.
- Solution ExplorerUnmanaged.cpp dosyayı açmak için çift tıklatın.
- Varsayılan kod için CUnmanaged::UnmanagedMethod aşağıdaki kodla değiştirin:
*lRetVal = 300;
return S_OK;
- Yapı) menüsünde tıklatın Build Solution COM bileşeni oluşturmak için.
Back to the
topBir .NET Server'ı oluşturmak için gereken adımları
Bu bölüm
ManagedServerMethod adlı tek bir yöntem uygulayan bir .NET sunucusuna nasıl oluşturulacağını gösterir.
ManagedServerMethod IManaged türünde bir örnek yer alır:
- Dosya menüsünden Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
- Visual C# ProjectsProject Types altında tıklatın ve sonra da şablonları altında Class Library ' ı tıklatın.
- Solution Ekle seçeneğini seçin ve Tamam ' ı tıklatın, bu seçeneği tıklatın.
- Varsayılan olarak oluşturulan Class1.cs dosyasında varsayılan kodu aşağıdaki kodla değiştirin:
using System;
using System.Runtime.InteropServices;
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IManaged
{
long ManagedMethod();
}
[ClassInterface(ClassInterfaceType.AutoDual)]
public class ManagedServer
{
public void ManagedServerMethod(IManaged managed)
{
Console.WriteLine("The output of IManaged.ManagedMethod is : {0}", managed.ManagedMethod());
}
}
Back to the
topBir Wrapper oluşturma adımları
Bu bölüm, bir sarmalayıcı sınıf IUnmanaged türünün bir örneği sarar ancak IManaged arabirimi sunar oluşturulması gösterilmiştir:
- Solution ExplorerClassLibrary1 genişletin.
- ClassLibrary1, Başvurular ' ı sağ tıklatın ve Add Reference</a1>'ı tıklatın.
- Başvuru Ekle iletişim kutusunda, COM</a0> sekmesini tıklatın.
- Bileşen adı altında ComComponent 1.0 tür kitaplığı ' nı tıklatın.
- Seç ' i tıklatın ve sonra Tamam ' ı tıklatın.
- Class1.cs dosyasında aşağıdaki kodu ekleyin:
[ComVisible(false)]
public class ComUnmanaged : IManaged
{
ComComponentLib.IUnmanaged unmanaged;
public ComUnmanaged(ComComponentLib.IUnmanaged unmanaged)
{
if(unmanaged != null)
this.unmanaged = unmanaged;
else
throw new ArgumentNullException("NULL");
}
public long ManagedMethod()
{
return unmanaged.UnmanagedMethod();
}
}
Back to the
topÖzel bir sıralayıcı oluşturmak için gereken adımları
Bu bölüm, bir yönetilen arabirimi (IManaged) yönetilmeyen bir arabirim (IUnmanaged) eşleştiren özel bir sıralayıcı oluşturulması gösterilmiştir:
Özel sıralayıcısı ıcustommarshaler arabirimini uygulamalıdır. Bir yönetilen arabirimi yönetilmeyen bir arabirim eşleştirilmiş
MarshalManagedToNative yöntemi denir. Geçerli senaryoyu yönetilmeyen yönetilen etki alanına s?ralar çünkü
MarshalManagedToNative yönteminin geçerli uygulama,
ıntptr.Zero döndürür.
MarshalNativeToManaged yöntemi, önceki bölümde tanımlanan bir kapsayıcı nesnesinde (
ComUnmanaged) yerel nesne kaydırılır. Yönetilmeyen bir arabirim için yönetilen bir arabirim eşleştirilmiş
MarshalNativeToManaged yöntemi denir.
Yerel arabirim ile ilişkili olan nesne yayımlandığında
CleanUpNativeData yöntemi olarak adlandırılır.
Benzer şekilde, yönetilen bir arabirimle ilişkili nesne serbest
CleanUpManagedData yöntemi denir. Yönetilen Nesne çöp toplama) olduğundan, uygulama
CleanUpManagedData yöntemi için boştur.
GetNativeDataSize yöntemi,
-1 döndürür.
Getınstance yöntemi ıcustommarshaler arabirimini için tanımlı değil de, bir kopyasını bir ıcustommarshaler döndüren
Getınstance statik yöntem tanımlamalısınız. Bu statik yöntem, özel Sıralayıcı örneğini oluşturmak için .NET çalışma zamanı tarafından verilir.
- Class1.cs için aşağıdaki kodu ekleyin:
[ComVisible(false)]
public class SampleMarshaler : ICustomMarshaler
{
static SampleMarshaler marshaler;
public object MarshalNativeToManaged(IntPtr pNativeData)
{
if(pNativeData == IntPtr.Zero)
return null;
object rcw = Marshal.GetObjectForIUnknown(pNativeData);
if(!(rcw is ComComponentLib.IUnmanaged))
throw new ArgumentException("The object must implement IUnmanaged");
return new ComUnmanaged((ComComponentLib.IUnmanaged) rcw);
}
public IntPtr MarshalManagedToNative(object managedObj)
{
return IntPtr.Zero;
}
public void CleanUpNativeData(IntPtr pNativeData)
{
Marshal.Release(pNativeData);
}
public void CleanUpManagedData(object managedObj)
{
}
public int GetNativeDataSize()
{
return -1;
}
public static ICustomMarshaler GetInstance(string cookie)
{
if(marshaler == null)
return marshaler = new SampleMarshaler();
return marshaler;
}
} - MarshalAsAttribute özel sıralanmış olan parametreyi ekleyin. Kod için ManagedServerMethod şu şekilde değiştirin:
public void ManagedServerMethod(
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(SampleMarshaler)), In]
IManaged managed)
{
Console.WriteLine("The output of IManaged.ManagedMethod is : {0}", managed.ManagedMethod());
} - Yapı) menüsünde tıklatın Build Solution.
- Dosya menüsünden Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
- Yeni proje) iletişim kutusunda, Visual C++ ProjectsProject Types altında tıklatın ve Win32 Projectşablonları altında tıklatın.
- Ad metin kutusuna ComClient yazın.
- Solution Ekle seçeneğini seçin ve Tamam ' ı tıklatın, bu seçeneği tıklatın.
- Win32 uygulama Sihirbazı iletişim kutusunda, Uygulama ayarları</a0> sekmesini tıklatın.
- Console Application seçmek için tıklatın Uygulama yazın bölümünde seçeneğini ve sonra da <a2>son</a2>'u tıklatın.
- Solution ExplorerComClient genişletin ve sonra da Stdafx.h çift tıklatın, dosyayı açmak için dosya. Dosyaya aşağıdaki kodu ekleyin:
#import "ComComponent.tlb" no_namespace raw_interfaces_only named_guids
#import "ClassLibrary1.tlb" no_namespace raw_interfaces_only named_guids
- Solution ExplorerComClient genişletin ve sonra bu dosyayı açmaya ComClient.cpp dosyasını çift tıklatın. File:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr;
IUnmanaged *unmanagedObj;
_ManagedServer *managedServer;
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_Unmanaged, NULL, CLSCTX_INPROC_SERVER, IID_IUnmanaged, (LPVOID *)&unmanagedObj);
if(FAILED(hr))
goto Error;
hr = CoCreateInstance(CLSID_ManagedServer, NULL, CLSCTX_INPROC_SERVER, IID__ManagedServer, (LPVOID *)&managedServer);
if(FAILED(hr))
goto Error;
hr = managedServer->ManagedServerMethod(unmanagedObj);
if(FAILED(hr))
goto Error;
return 0;
Error:
CoUninitialize();
return hr;
} - ClassLibrary1.tlb oluşturmak için <a0></a0>, komut isteminde aşağıdaki komutu yazın:
RegAsm TLB ClassLibrary1.dll
ClassLibrary1.dll dosya ClassLibrary1 proje için <a1>Yapı</a1> dizininde olduğunu doğrulayın. ClassLibrary1.dll the ClassLibrary1.tlb oluşturur ve bu da sınıf kitaplığı kaydeder. - ClassLibrary1.tlb dosya ve ComComponent.tlb, ComClient uygulama için <a1>Proje</a1> dizinine dosya kopyalama.
- Yapı) menüsünde tıklatın Build Solution.
- ComClient konsol uygulaması için <a1>Yapı</a1> dizinine ClassLibrary1.dll dosya ve ClassLibrary1 <a1>Yapı</a1> dizini Interop.comclientLib.dll dosyasından proje Kopyala.
- Solution ExplorerComClient ' ı sağ tıklatın ve sonra da <a2>Başlangıç proje olarak ayarla</a2>'ı tıklatın.
- Hata Ayıkla) menüsünde, Başlat ' ı tıklatın.
Back to the
top