将本地化的卫星 dll 嵌入到 exe 应用程序中
Embedding localized satellite dll into exe application
我有一个 C++ CLR/CLI 项目,我想知道如何将本地化的卫星 dll 嵌入到我的 exe 应用程序中,我找到了类似的解决方案,但它适用于 C# 项目,这与我的项目结构有很大不同。
是否可以将其直接嵌入到二进制文件中?
顺便说一句,我遇到了命名空间问题,我的自定义命名空间似乎没有链接到我的本地化资源文件。
我一直在寻找 C++ CLR/CLI 项目的解决方案,它与 C# 项目明显不同,后者显然带有 Build Action
和 Custom Tool Namespace
所有这些我们在 CLR/CLI 项目中没有的选项,这非常重要,特别是如果我们更改了命名空间,所以我们必须使用 Resource Logical Name
来代替。这是 如何解决命名空间问题,这也适用于链接到卫星 dll 的本地化资源文件。
生成本地化卫星 dll 后,将其作为 Compiled Managed Resource
包含在您的项目中,您可以通过打开其文件 属性 并设置 Item Type
来设置它。在诸如 C# 之类的项目中,您不会找到它,而是类似于 "Embedded Resource" 的东西。无论如何,这仅适用于 C++ CLR/CLI 项目。如果您更改了名称空间,请不要忘记设置相应资源文件的 Resource Logical Name
。
下一步是编写一些代码,以便将该 dll 嵌入到我们的 exe 应用程序中,这是一个很好的代码:
由于 C++ CLR/CLI 不支持 lambda 表达式,我们必须这样做:
private: System::Reflection::Assembly^ currentDomainAssemblyResolve(System::Object^ sender, System::ResolveEventArgs^ args) {
System::Reflection::AssemblyName^ assemblyName = gcnew System::Reflection::AssemblyName(args->Name);
System::String^ resourceName = assemblyName->Name + ".dll";
System::IO::Stream^ stream = System::Reflection::Assembly::GetExecutingAssembly()->GetManifestResourceStream(resourceName);
array<Byte>^ assemblyData = gcnew array<Byte>((unsigned long) stream->Length);
try {
stream->Read(assemblyData, 0, assemblyData->Length);
} finally {
if (stream != nullptr) delete stream;
}
return System::Reflection::Assembly::Load(assemblyData);
}
用法:
//Put it in your constructor before InitializeComponent()
MyClass(void) {
AppDomain::CurrentDomain->AssemblyResolve += gcnew System::ResolveEventHandler(this, &MyNameSpace::MyClass::currentDomainAssemblyResolve);
InitializeComponent();
}
所以现在不再需要卫星 dll 来加载您的本地化资源。
使用免费的应用程序打包器将文件打包成单个 exe。
https://enigmaprotector.com/en/aboutvb.html
这个是免费的,我用过,效果很好。
我有一个 C++ CLR/CLI 项目,我想知道如何将本地化的卫星 dll 嵌入到我的 exe 应用程序中,我找到了类似的解决方案,但它适用于 C# 项目,这与我的项目结构有很大不同。 是否可以将其直接嵌入到二进制文件中? 顺便说一句,我遇到了命名空间问题,我的自定义命名空间似乎没有链接到我的本地化资源文件。
我一直在寻找 C++ CLR/CLI 项目的解决方案,它与 C# 项目明显不同,后者显然带有 Build Action
和 Custom Tool Namespace
所有这些我们在 CLR/CLI 项目中没有的选项,这非常重要,特别是如果我们更改了命名空间,所以我们必须使用 Resource Logical Name
来代替。这是
生成本地化卫星 dll 后,将其作为 Compiled Managed Resource
包含在您的项目中,您可以通过打开其文件 属性 并设置 Item Type
来设置它。在诸如 C# 之类的项目中,您不会找到它,而是类似于 "Embedded Resource" 的东西。无论如何,这仅适用于 C++ CLR/CLI 项目。如果您更改了名称空间,请不要忘记设置相应资源文件的 Resource Logical Name
。
下一步是编写一些代码,以便将该 dll 嵌入到我们的 exe 应用程序中,这是一个很好的代码:
由于 C++ CLR/CLI 不支持 lambda 表达式,我们必须这样做:
private: System::Reflection::Assembly^ currentDomainAssemblyResolve(System::Object^ sender, System::ResolveEventArgs^ args) {
System::Reflection::AssemblyName^ assemblyName = gcnew System::Reflection::AssemblyName(args->Name);
System::String^ resourceName = assemblyName->Name + ".dll";
System::IO::Stream^ stream = System::Reflection::Assembly::GetExecutingAssembly()->GetManifestResourceStream(resourceName);
array<Byte>^ assemblyData = gcnew array<Byte>((unsigned long) stream->Length);
try {
stream->Read(assemblyData, 0, assemblyData->Length);
} finally {
if (stream != nullptr) delete stream;
}
return System::Reflection::Assembly::Load(assemblyData);
}
用法:
//Put it in your constructor before InitializeComponent()
MyClass(void) {
AppDomain::CurrentDomain->AssemblyResolve += gcnew System::ResolveEventHandler(this, &MyNameSpace::MyClass::currentDomainAssemblyResolve);
InitializeComponent();
}
所以现在不再需要卫星 dll 来加载您的本地化资源。
使用免费的应用程序打包器将文件打包成单个 exe。
https://enigmaprotector.com/en/aboutvb.html
这个是免费的,我用过,效果很好。