Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tüm yönetilen kodlarda olduğu gibi .NET uygulamaları da bir konak tarafından yürütülür. Ana bilgisayar, çalışma zamanı ortamını (JIT ve garbage collector gibi bileşenler dahil) başlatmaktan ve yönetilen giriş noktalarını çağırmaktan sorumludur.
.NET çalışma zamanını barındırmak gelişmiş bir senaryodur ve .NET derleme işlemleri .NET uygulamalarını çalıştırmak için varsayılan bir konak sağladığından çoğu durumda .NET geliştiricilerinin barındırma konusunda endişelenmesi gerekmez. Ancak bazı özel durumlarda, yönetilen kodu yerel bir işlemde çağırmanın bir aracı olarak .NET çalışma zamanını açıkça barındırmak veya çalışma zamanının nasıl çalıştığı üzerinde daha fazla denetim sahibi olmak yararlı olabilir.
Bu makalede yerel koddan .NET çalışma zamanını başlatmak ve içinde yönetilen kod yürütmek için gereken adımlara genel bir bakış verilmektedir.
Önkoşullar
Barındırıcılar yerel uygulamalar olduğundan, bu kılavuz .NET barındırmak için bir C++ uygulaması oluşturmayı kapsar. Bir C++ geliştirme ortamına (Visual Studio tarafından sağlanan ortam gibi) ihtiyacınız vardır.
Ayrıca, konağı test etmek için bir .NET bileşeni oluşturmanız gerekir, bu nedenle en son .NET SDK'sını yüklemeniz gerekir. Bağlantı için gerekli başlıklar ve kütüphaneleri içerir.
Barındırma API'leri
.NET çalışma zamanını barındırmak, nethost ve hostfxr kitaplıklarının API'leriyle gerçekleştirilir. Bu giriş noktaları, başlatma için çalışma zamanını bulma ve ayarlamanın karmaşıklığını ele alır ve hem yönetilen bir uygulama başlatmaya hem de statik yönetilen bir yönteme çağrılmasına izin verir.
Önemli
nethost ve hostfxr barındırma API'leri yalnızca framework bağımlı dağıtımları destekler. Bağımsız dağıtımlar tek başına yürütülebilir dosyalar olarak ele alınmalıdır. Uygulamanız için dağıtım modellerini değerlendiriyorsanız, bu yerel barındırma API'leriyle uyumluluğu sağlamak için çerçeveye bağımlı bir dağıtım kullanın.
nethost.h ve hostfxr.h kullanarak bir konak oluşturun
Aşağıdaki öğreticide açıklanan adımları gösteren örnek bir ana bilgisayar dotnet/samples GitHub deposunda bulunabilir. Örnekteki açıklamalar, bu öğreticideki numaralandırılmış adımları, örnekte uygulandıkları yerlerle açıkça ilişkilendirir. İndirme yönergeleri için bkz. Örnekler ve Öğreticiler.
Örnek konağın öğrenme amaçlı olarak kullanılması gerektiğini, bu nedenle hata kontrolünün az olduğunu ve verimlilikten ziyade okunabilirliğe vurgu yapan bir tasarıma sahip olduğunu aklınızda bulundurun.
Aşağıdaki adımlar, yerel bir uygulamada .NET çalışma zamanını başlatmak ve yönetilen bir statik yönteme çağrıda bulunmak için nethost ve hostfxr kitaplıklarının nasıl kullanılacağını ayrıntılı olarak açıklar.
Örnektenethost üst bilgileri ve kitaplığı ile .NET SDK ile yüklenen coreclr_delegates.h ve hostfxr.h üst bilgileri kullanılır.
1. Adım - hostfxr'i yükleyin ve dışarı aktarılan barındırma işlevlerini alın
nethost kitaplığı bulmak için get_hostfxr_path işlevini sağlar. Kitaplık, hostfxr .NET çalışma zamanını barındırmaya yönelik işlevleri kullanıma sunar. İşlevlerin tam listesi ve hostfxr.h bulunabilir. Örnek ve bu öğreticide aşağıdakiler kullanılır:
-
hostfxr_initialize_for_runtime_config: Bir konak bağlamı başlatır ve belirtilen çalışma zamanı yapılandırmasını kullanarak .NET çalışma zamanının başlatılmasını hazırlar. -
hostfxr_get_runtime_delegate: Çalışma zamanı işlevselliği için bir temsilci alır. -
hostfxr_close: Konak bağlamını kapatır.
Kütüphane hostfxr, get_hostfxr_path kütüphanesinden nethost API kullanılarak bulunur. Daha sonra yüklenir ve dışarı aktarmaları alınır.
// Using the nethost library, discover the location of hostfxr and get exports
bool load_hostfxr()
{
// Pre-allocate a large buffer for the path to hostfxr
char_t buffer[MAX_PATH];
size_t buffer_size = sizeof(buffer) / sizeof(char_t);
int rc = get_hostfxr_path(buffer, &buffer_size, nullptr);
if (rc != 0)
return false;
// Load hostfxr and get desired exports
void *lib = load_library(buffer);
init_fptr = (hostfxr_initialize_for_runtime_config_fn)get_export(lib, "hostfxr_initialize_for_runtime_config");
get_delegate_fptr = (hostfxr_get_runtime_delegate_fn)get_export(lib, "hostfxr_get_runtime_delegate");
close_fptr = (hostfxr_close_fn)get_export(lib, "hostfxr_close");
return (init_fptr && get_delegate_fptr && close_fptr);
}
Örnek, aşağıdakileri içerir:
#include <nethost.h>
#include <coreclr_delegates.h>
#include <hostfxr.h>
Bu dosyalar aşağıdaki konumlarda bulunabilir:
- https://github.com/dotnet/runtime/blob/main/src/native/corehost/nethost/nethost.h
- https://github.com/dotnet/runtime/blob/main/src/native/corehost/coreclr_delegates.h
- https://github.com/dotnet/runtime/blob/main/src/native/corehost/hostfxr.h
2. Adım - .NET çalışma zamanını başlatma ve çalıştırma
hostfxr_initialize_for_runtime_config ve hostfxr_get_runtime_delegate işlevleri, yüklenecek yönetilen bileşen için çalışma zamanı yapılandırmasını kullanarak .NET çalışma zamanını başlatır ve çalıştırır.
hostfxr_get_runtime_delegate işlevi, yönetilen bir derlemeyi yüklemeye ve o derlemedeki bir statik yöntemin işlev işaretçisini almaya olanak tanıyan bir çalışma zamanı delege elde etmek için kullanılır.
// Load and initialize .NET Core and get desired function pointer for scenario
load_assembly_and_get_function_pointer_fn get_dotnet_load_assembly(const char_t *config_path)
{
// Load .NET Core
void *load_assembly_and_get_function_pointer = nullptr;
hostfxr_handle cxt = nullptr;
int rc = init_fptr(config_path, nullptr, &cxt);
if (rc != 0 || cxt == nullptr)
{
std::cerr << "Init failed: " << std::hex << std::showbase << rc << std::endl;
close_fptr(cxt);
return nullptr;
}
// Get the load assembly function pointer
rc = get_delegate_fptr(
cxt,
hdt_load_assembly_and_get_function_pointer,
&load_assembly_and_get_function_pointer);
if (rc != 0 || load_assembly_and_get_function_pointer == nullptr)
std::cerr << "Get delegate failed: " << std::hex << std::showbase << rc << std::endl;
close_fptr(cxt);
return (load_assembly_and_get_function_pointer_fn)load_assembly_and_get_function_pointer;
}
3. Adım - Yönetilen derlemeyi yükleme ve yönetilen yönteme işlev işaretçisi alma
Yönetilen derlemeyi yüklemek ve yönetilen bir yönteme işlev işaretçisi almak için çalışma zamanı temsilcisi çağrılır. Temsilci, derleme yolunu, tür adını ve yöntem adını giriş olarak gerektirir ve yönetilen yöntemi çağırmak için kullanılabilecek bir işlev işaretçisi döndürür.
// Function pointer to managed delegate
component_entry_point_fn hello = nullptr;
int rc = load_assembly_and_get_function_pointer(
dotnetlib_path.c_str(),
dotnet_type,
dotnet_type_method,
nullptr /*delegate_type_name*/,
nullptr,
(void**)&hello);
Çalışma zamanı temsilcisini çağırırken nullptr ifadesini temsilci tür adı olarak ileterek, örnek yönetilen yöntem için varsayılan bir imza kullanır.
public delegate int ComponentEntryPoint(IntPtr args, int sizeBytes);
Çalışma zamanı temsilcisi çağrılırken temsilci türü adı belirtilerek farklı bir imza kullanılabilir.
4. Adım : Yönetilen kodu çalıştırın!
Yerel konak artık yönetilen metodu çağırabilir ve istenen parametreleri geçirebilir.
lib_args args
{
STR("from host!"),
i
};
hello(&args, sizeof(args));
Sınırlamalar
Tek bir işlem içinde yalnızca bir çalışma zamanı yüklenebilir.
hostfxr_initialize_for_runtime_config Bir çalışma zamanı zaten yüklendiğinde API çağrılırsa, mevcut çalışma zamanının belirtilen başlatma parametreleriyle uyumlu olup olmadığını denetler. Uyumluysa, mevcut çalışma zamanı kullanılır ve uyumlu değilse API bir hata döndürür.