将本地化的人造dll嵌入exe应用程序

时间:2019-06-30 23:55:26

标签: c++ .net winforms c++-cli clr

我有一个C ++ CLR / CLI项目,我想知道如何将本地化的人造dll嵌入到我的exe应用程序中,我找到了类似的解决方案,但这是针对C#项目的,这与我的项目结构大不相同。 是否可以将其直接嵌入二进制文件中? 顺便说一句,我遇到了名称空间问题,看来我的自定义名称空间未链接到本地​​化的资源文件。

2 个答案:

答案 0 :(得分:0)

我一直在努力寻找C ++ CLR / CLI项目的解决方案,这与显然Build ActionCustom Tool Namespace附带的所有C#项目相比,C#项目完全不同。在CLR / CLI项目中,这确实很重要,特别是如果我们更改了命名空间,则必须改用Resource Logical Namemy answer下面介绍了如何解决命名空间问题,这也适用于链接到附属dll的本地化资源文件。

生成本地化的人造dll后,将其作为Compiled Managed Resource包含在您的项目中,可以通过打开其文件属性并设置Item Type来进行设置。在诸如C#的项目中,您不会找到类似的东西,但会找到类似“嵌入式资源”的东西。无论如何,这仅适用于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来加载本地化资源。

答案 1 :(得分:0)

使用免费的应用程序打包工具将文件捆绑到单个exe文件中。

https://enigmaprotector.com/en/aboutvb.html

这个是免费的,我用它,对我来说很好用。