如何将C#和C++程序集链接成一个可执行文件?
我有VS2008解决方案,CONTA一个生成C#可执行文件的项目,该项目引用了一个同时包含C ++/CLI和UNAMARED C ++的DLL的项目. 我想将它们合并到一个可执行文件中,因为C ++ DLL包含我要嵌入主要可执行文件的安全代码. 我无法使用ilmerge,因为DLL包含托管和未管理的代码.建议的解决方案似乎是使用link.exe将C#汇编与C ++对象文件链接.这就是我要做的. 我手动编辑了C#可执行文件的项目文件以生成NetModule.我在可执行的项目中添加了一个帖子构建步骤,以运行link.exe以将C#NetModule和编译的C ++对象文件链接在一起,然后运行mt.exe以合并两个项目创建的汇编表现.这是成功运行的,但是EXE仍然包含对C ++项目的普通构建过程生成的DLL中定义的C ++类型. . 然后, i在C ++ DLL的项目设置中指定/noAssembly,因此它也会生成NetModule.在C#项目中,我删除了对C ++项目
0 2024-04-12
编程技术问答社区
System.Web.Extensions大会无法解决
我正在尝试运行一个.NET 4.0控制台应用程序,该应用程序引用了姐妹库项目(BAR.DLL)本身引用System.web.extensions in VS2010 B2中的extensions.我目前只有兴趣访问System.Web.Scripting.JavaScriptSerializer. 两个项目都有对system.web.extensions的参考(使用应用程序参考对话框中的" .NET"下列出的一个项目),但是当我尝试编译/运行应用程序时,编译器吠叫: C:\Windows\Microsoft.NET\Framework\v4.0.21006\Microsoft.Common.targets(1291,9): warning MSB3253: The referenced assembly "Bar.dll" could not be resolved because it has a dependency on "System.Web.Extensions,
0 2024-04-12
编程技术问答社区
.NET应用程序的链接器现状(又称 "请先生给我一个链接器 "2009版)
这里的许多人可能熟悉 Joel Spolsky 最受欢迎的博客文章,请先生,请先生,我有一个链接器,他哭了出去删除.net Framework上的依赖项的方法因此可以开发和出售独立应用程序. jason Zander 当时的Visual Studio开发团队的Jason Zander 回答快进到2009年.现在有几个小组声称有C#链接器. (杰森·赞德(Jason Zander)甚至说,实施不需要太多.)我们现在拥有一个大量的200-300 MB跨平台完整.NET 3.5安装程序,而不是可爱的,十二so的梅格下载.其中包含X86,X64和IA64的.NET版本.微软降低运行时大小的建议包括: 解开可重新分配的包装,删除您不需要的目标平台,然后将其放回原处 使用仅下载平台库的Web Bootstrapper 使用客户端配置文件安装程序(截至2008年底),该安装程序的库有限,仅适用于x86 使事情变得更糟,据我理解(如果我错了,请纠正我),客户端配置文件甚至都没有以.
0 2024-04-11
编程技术问答社区
什么是'静态链接'和'动态链接'?
我经常听到术语"静态链接"和"动态链接",通常是指 c , c ++ 或en.wikipedia.org/wiki/c_sharp_%28 programming_language%29" rel =" noreferrer"> c#.他们是什么,他们到底在说什么,他们在谈论什么? 解决方案 (在大多数情况下,折现解释的代码)从源代码(您编写的内容)到可执行代码(您运行的内容)时有两个阶段. 第一个是将源代码转换为对象模块的汇编. 第二个链接是将对象模块组合在一起以形成可执行文件的方法. 除其他外,允许将第三方库包含在您的可执行文件中,而无需查看其源代码(例如用于数据库访问,网络通信和图形用户界面)或以编译代码中的代码不同的语言(例如C和汇编代码),然后将它们链接在一起. 当您静态将文件链接到可执行文件中时,该文件的内容在链接时间中包含.换句话说,文件的内容实际插入了您将运行的可执行文件中. 当您链接动态时,在可执行文件中包含了要链接的文件的指针(例
4 2024-04-10
编程技术问答社区
将DLLs嵌入已编译的可执行文件中
是否可以将预先存在的dll嵌入到编译的C#可执行文件中(以便您只有一个文件要分发)?如果可能的话,一个人将如何做? 通常,我很酷,只是把DLL丢在外面,设置程序处理一切,但是有几个工作中的人问我这个,老实说我不知道​​. 解决方案 我强烈建议使用 costura.fody - 到目前为止,将资源嵌入您的大会.它可作为Nuget软件包. Install-Package Costura.Fody 将其添加到项目后,它将自动将复制到输出目录的所有引用嵌入到您的 main 汇编中.您可能需要通过在项目中添加目标来清洁嵌入式文件: Install-CleanReferencesTarget 您还可以指定是否包括PDB,排除某些组件或即时提取组件.据我所知,也支持不受管理的集会. 更新 目前,有些人正在尝试添加支持DNX. 更新2 对于最新的FODY版本,您需要拥有MSBUILD 16(SO Visual Studio 2019). Fody v
0 2024-04-10
编程技术问答社区
链接和使用头文件的区别是什么?
例如,链接两个文件 有什么区别 gcc -c func.c gcc -c main.c gcc func.o main.o -o main 使用标头文件 #include func.h int main{ .... .. } 如果他们似乎完成了同一件事? 解决方案 他们没有"完成同一件事".他们完成了同一件事的互补部分.通常,您必须同时做:仅做一个或另一个完全不足. 这是一个不完美的类比:假设您想在房子上加入.在项目开始时,您可以在与建筑商的合同中签名,并指定加法的大小和完成.在项目结束时,您可以在支票上签名,以支付建造者的工作.签署合同和签署支票有什么区别?你为什么必须同时做同样的事情,即让你新添加? 包括标头(例如),就像签订合同一样.当您说#include 时,您是在说:"嘿,编译器,有一些数学功能.在将数字传递到sqrt之前,您要从int> double进行转换,并确保在将结果分配给double之前,请确保从doub
4 2024-04-10
编程技术问答社区
当用-O选项编译时,无法写入LD链接器脚本中定义的变量
我正在编写一个程序来运行裸金属.我正在尝试从自定义链接器脚本中写入变量.使用-O0选项编译时,该代码可完美运行,但使用-os选项编译时不预期. 我使用的代码如下. main.c: #define TTB_BASE (&Image$$TTB) extern unsigned int Image$$TTB; int main () { *TTB_BASE = 56326; unsigned int *ttb=TTB_BASE+16; for (int i = 0; i
0 2024-04-10
编程技术问答社区
不能用IAR ARM编译器将函数表强制到特定地址
我有一个函数表类型,如 typedef struct { uint16_t majorRevision; uint16_t minorRevision; uint8_t (*CommInit)(void *); uint8_t (*CommDeInit)(void); uint16_t (*Write)(uint8_t *, uint16_t); uint16_t (*Read)(uint8_t *, uint16_t); uint8_t (*Attached)(void); uint8_t (*ExitApp)(uint8_t); uint8_t (*Jump)(uint32_t address); uint16_t (*GetCRC)(uint8_t*, uint32_t); int (*Encrypt)(uint8_t *, uint32_t); int
0 2024-04-10
编程技术问答社区
在运行时链接和加载共享库
我读到您可以使用dlfcn.h使用Dynamic Linker API,这是使用API​​ 的代码示例 #include #include #include int x[2]={1,2}; int y[2]={3,4}; int z[2]; int main(){ void *handle; void(*addvec)(int *,int *,int *,int); char *error; // Dynamically load shared library that contains addvec() handle=dlopen("./libvec.so",RTLD_LAZY); if(!handle){ fprintf(stderr,"%s\n",dlerror()); exit(1); } // Get a pointer to the addvec() fun
0 2024-04-10
编程技术问答社区
关于C语言中的静态库和共享库的链接问题
#include int main() { printf("%s","Hello world"); return 0; } $gcc -o hello hello.c 问题: 1-我相信printf函数的对象文件是静态链接的.这是正确的吗? 2-我应该如何配置/编写此代码,以便将库文件动态链接,或者我的意思是在运行时使用共享库? 注意:我是这个概念的初学者,所以随意纠正我,无论在任何地方都不是有意义的 解决方案 链接器采取的任何内容.这通常是共享库. 在Linux系统上,您可以使用 file hello 找出它是在静态还是动态上链接的. 例如. file /bin/bash 给出 /bin/bash:Elf 64位LSB可执行文件,X86-64,版本1(SYSV),动态链接(使用共享libs),用于GNU/Linux 2.6.
0 2024-04-10
编程技术问答社区
编译的gcc .s代码在连接时出现的问题
第一次在这里,我运行kali linux 64bits,im im linux菜鸟和一个新的asm asmell. #include #include //strlen #include #include //inet_addr int main(int argc , char *argv[]) { int socket_desc; struct sockaddr_in server; char *message , server_reply[2000]; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } server.sin_addr.s_addr = inet_add
0 2024-04-10
编程技术问答社区
查看链接器对可执行二进制文件使用的确切内存范围
我正在做一些OSDEV,并且我一直在尝试在内核中实现内存管理.我从物理内存管理器开始(这是一个32位OS).这个想法是要保留一个钻头,我们每个4K物理内存块分配一点.如果位是" 1",则使用该块,如果" 0"为" 0",则不是.我认为这张桌子应该追随内核.所以这是我的内核代码(最小): #include #define PMMAP 0x1000 //This contains information from int 15h/E820 #define BLOCK_SIZE 4096 #define SECTOR_SIZE 512 #define SECTORS_PER_BLOCK 8 #define BLOCK_SIZE_B 12 #define SECTOR_SIZE_B 9 #define SECTORS_PER_BLOCK_B 3 void pmmngr_init(uint32_t kernelsize,uint32_t mapentrycount
0 2024-04-10
编程技术问答社区
来自同一个库的两个函数:为什么一个产生未定义引用而另一个没有?
我想在功能中替换PTHREAD_MUTEX_LOCK pthread_mutex_trylock,当我这样做时,我会收到"未定义的参考"错误消息(请参阅下文).如果我由PTHREAD_MUTEX_LOCK(&cmd_queue_lock)替换了第411-13号线,则我没有链接器错误. 它们都是我已经包含的同一库.一个人为什么生成链接器错误,另一个没有生成链接错误?更重要的是,我该如何解决?我尝试添加" extern int pthread_mutex_trylock"并更改makefile中的.o文件的顺序,但两者都不起作用. $ nl clientmain.c 12 #include ... 21 #include 411 if (pthread_mutex_trylock(&cmd_queue_lock) == EBUSY) { 412 continue; 413
0 2024-04-10
编程技术问答社区
用于将二进制文件嵌入obj文件的命令行工具
可能的重复: 如何将二进制数据嵌入/链接到C ++ dll 我需要一个命令行工具,该工具可以嵌入我的二进制文件 进入某些(C方式可链接).OBJ文件 - 此二进制数据应 在某些给定的符号下从C代码到达它 有这样的工具吗? (我对窗户特别感兴趣 平台,COFF和OMF格式) 解决方案 如果您正在使用GCC.您可以使用链接器来使用以下操作: ld -r -b binary -o foo.o foo.txt 看看其他解决方案 如果仅Windows解决方案就足够,即不需要便携性,您也可以使用二进制资源和"标准"资源编译器,工具和格式. 资源不必只是图标,光标,对话框等,但也可以是任意数据.这是我不知道您到底要在这里实现什么,但是如果您搜索Stackoverflow或Google以找到"嵌入二进制资源",您会发现几个示例.
4 2024-04-10
编程技术问答社区
是否所有的gcc版本都支持gcc'的@file选项?
据我记得,一些较旧的GCC版本不支持@file选项.我不确定.有人可以给出任何有关的指针吗? 用于参考 @file Read command-line options from file. The options read are inserted in place of the original @file option. If file does not exist, or cannot be read, then the option will be treated literally, and not removed. Options in file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or
0 2024-04-10
编程技术问答社区
在最后加载的精灵部分之后,闪存中存在的额外数据
我有一个涉及引导加载程序的STM32项目. Bootloader CRCS闪光灯的整个应用程序区域,然后将此值与flash的应用图像区域之后存储的固件标头进行比较. 我写了一个python脚本,该脚本是在二进制构建之后运行的.该脚本将构建产生的小精灵文件接收到"虚拟闪存"图像中,该图像通常代表MCU正常加载后MCU上存在的内容.阵列开始是应用区域的大小,每个字节的初始值为0xff,就像闪光灯在完整擦除之后一样.然后,该脚本从Elf中获取每个部分,并覆盖该部分应位于该部分的虚拟闪光图像的部分. 最后,脚本CRCS应用程序区域并将结果值注入原始精灵. 这一切都很好,但是我在MCU的实际闪存内容中看到了其他数据,这些数据无法确定其来源.在编程精灵之前,将闪光灯完全删除,因此该数据来自加载到设备上的小精灵. 我猜想这里发生的是精灵中有一些部分,我的脚本忽略了,但是当使用常规手段闪烁时,这些部分仍将其写入Flash. 以下是我的应用程序图像上阅读的结果: 部分标
0 2024-04-10
编程技术问答社区
源文件找不到头文件
我已经查看了以下链接: this 还有其他几个类似的类似. 这里给出的答案都没有工作. 我有两个源文件a1.c,a2.c和两个标头文件a1.h和a2.h.我想在这两个文件中包括标题文件(在A1.C中A2.C,因为我需要在A2.C中使用一个函数) ) 我包括 #include "a1.h" #include "a2.h" 在A1.C 的源文件中 我在Ubuntu上使用GCC.并使用命令gcc a1.h -o a1.out -lm 而且那没用. 我尝试了 gcc -c -I/Home/Documents/ctests/ a1.c -o a1.out 以及 gcc -c a1.c -I/Home/Documents/ctests/ -o a1.out 我的拼写也可以(无论如何,几乎没有任何错误的空间,一个字母和一个数字作为文件名). 另外,所有文件都位于同一文件夹中. 我知道这可能是一个微不足道的问题,但我陷入了这一问题,并
0 2024-04-10
编程技术问答社区
如何从汇编代码中调用一个C函数
我在从汇编代码转换为C.我在以某种方式加载了内核,将其放在第二阶段引导程序中,并增加了在第一阶段启动加载程序中加载的扇区数量.如您在这里看到的: boot1.asm: ;----------------------------------------------; ; ; The BoneOS Stage 1 Bootloader ; ----------------------------- ; ; ; Contributors : @amanuel2 ; ; ;----------------------------------------------; [ORG 0x7c00] ;We Will Set Registers to point to 0x7C00 Later [ BITS 16 ]; 16 bits real mode JMP main_first ; Jump to Main Function of the Bootloader ;/
0 2024-04-10
编程技术问答社区
链接错误:全局变量的多重定义
我正在使用GCC来编译许多.c文件.假设以下是这样: c文件是: main.c tree.c 标题文件是: tree.h 我在tree.h中声明了一些戈尔巴变量.假设以下是分配的值的全局变量: int fanout = 5; 早些时候,我在 tree.c 文件中保留了main()函数.链接没有问题.但是现在我想将主函数保持分开.我刚刚在新创建的.c文件中移动了主函数.现在问题是 显示链接错误: main.o error: fanout declared first time tree.o error: multiple declaration of fanout. 请让我知道如何摆脱这个问题. 预先感谢. 解决方案 当您包括在多个源文件中声明并定义int fanout的标头文件时,您会破坏一个定义规则. 根据ODR,一个翻译单元(标头文件+源文件)中只能有一个定义. 为了避免, 您需要使用extern关键字.三个
2 2024-04-10
编程技术问答社区
Swift与C/C++库的链接和构建
我没有Swift的任何以前的经验. 我有一个静态库libseriallib.a,它用C ++编写,但使用extern C>. 具有C包装器接口 我想将此库链接到Swift IOS应用程序中.我正在从头开始创建此应用程序. libseriallib.a有三个库取决于.这些是:libz.a,'libcrypto.a , libssh.a`. 我遵循了第二种方法,提到的第二种方法我现在看起来像这样的错误: Apple Mach-O Linker Warning Group ld: warning: URGENT: building for iOS simulator, but linking in object file (/Users/duminda/dev/swiftlibtest/libseriallib.a(seriallib.cpp.o)) built for OSX. Note: This will be an error in the future.
0 2024-04-10
编程技术问答社区