草庐IT

c# - 在非托管 c++ dll 中使用托管 c# dll

非托管C++.dll如何知道托管C#.dll的位置?一些背景:我有一个导入类型库(.tlb)的c++.dll,在其中一个c++函数中,我实例化了一个指向c#.dll中函数的指针。然后,使用该指针,我可以在C++中调用C#函数。我想知道c++.dll是如何知道c#.dll在哪里的?此外,是否有更好的方法来进行此类编码?.tlb是否需要与c#.dll位于同一目录中? 最佳答案 完成上述任务的一种方法是使用regasm命令向MicrosoftWindows注册表注册C#dll文件。此命令EXE包含在VisualStudios的发行版中。命

c++ - DLL缓存问题

从尽可能高的性能角度来看,static与dynamic库链接选项是否也会因为DLL的缓存未命中率较高而对性能产生影响?我的想法是,当库被静态链接时,整个程序被加载到一个地方或附近。但是当动态链接时,DLL可以加载到某处并且它的变量可以分配“太远”。这是真的,还是说DLL在缓存未命中率方面没有性能损失?(仅限快速C/C++代码) 最佳答案 “整个程序加载到一个地方”:你的系统的内存管理器仍然会根据自己的喜好将可执行内存页映射到物理内存上——你无法控制它。在运行时,如果需要可执行代码的其他部分,物理页面将换出到磁盘。当多个进程实际上可以

c++ - 如何使用 visual studio 编译 c++ dll?

我有一些要编译成dll文件的C++类。当我尝试编译项目时,收到未解析的外部符号错误:errorLNK2019:unresolvedsymbol_WinMain@16referencedinfunctiontmainCRTStartupfatalerrorLNK1120:1unresolvedexternal这是我到目前为止所做的:我刚刚创建了一个新的win32项目,选择了dll和空项目。然后我把所有的h和cpp文件复制到目录下,添加到项目中。此外,我添加了一个包含以下代码的文件“DllMain.cpp”:#includeBOOLAPIENTRYDllMain(HANDLEhModule

c# - 将 cout 从 C++ dll 重定向到 C# 中的文本框

我正在尝试将dll中方法的控制台输出(cout)显示到C#程序中的文本框。每次调用该方法时,控制台输出都会显示在VisualStudio的输出Pane中。有没有办法将输出Pane的内容重定向到文本框?dll是由其他人用C++编写的,我无法更改它。该dll使用SWIG包装,以便我的C#代码可以调用它。 最佳答案 在点击David建议的链接后,我决定针对您的问题编写一个更具体的解决方案。此版本允许您通过BackgroundWorkerPropertyChangedEventHandler回调在GUI中接收标准输出。这是ConsoleRe

c++ - 在没有函数修饰的情况下导出 dll 中的类

我想知道如何去除我需要在dll中导出的类函数周围的装饰。例如,当你有这样的事情时:extern"C"{__declspec(dllexport)int__cdeclgetWhatever();}并且您使用导出的函数名称dependencyWalker进行验证,您将拥有完全相同的函数名称。但是如果你对一个类做类似的事情,就会有一堆像这样装饰函数的字符:extern"C"{class__declspec(dllexport)Toto{__cdeclToto(){}__cdecl~Toto(){}int__cdeclgetBlob(floaty){return(int)y;}};}在depe

c# - 无法在 DLL 中找到入口点

我有一个C#应用程序,我试图从中向C++函数发送参数。但是,我收到错误(在主题中提到)C#应用程序:staticclassSegmentationFunctions{[DllImport("MyApplication.dll",EntryPoint="fnmain",CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Ansi)]publicstaticexternintfnmain(stringsearch);}}publicpartialclassMainWindow:Window{publicMainWindow()

c++ - 是否可以验证 WinRT 组件 DLL?

我正在尝试让SQLite与WinRT兼容。我已将WinRT不支持的旧调用切换为新调用。现在我已经编译了项目,我想验证它没有使用任何旧的API调用或不受支持的调用。WindowsAppCertKit似乎只能验证实际的Metro应用程序。如何验证WinRTDLL?编辑:应用认证套件中似乎存在错误。它似乎没有验证引用的dll。如果您将代码移至应用程序,它会对其进行验证。此外,对于Metro不支持的调用,编译时错误并不总是存在。我需要设置一个标志来在编译时捕获这些错误吗?有问题的文件是一个C文件,仅为此文件关闭了WinRT扩展。 最佳答案

c++ - 共享对象和dll之间的区别

我有一个库,它在编译时正在构建一个名为libEXAMPLE.so(在so.le文件夹中)的共享对象,以及一个名为EXAMPLE.so的dll(在dll文件夹中)。这两个共享对象的大小非常相似,看起来完全是一回事。在互联网上搜索显示,程序使用dll进行符号解析的方式与使用共享对象的方式可能有所不同。你们能帮我理解一下吗? 最佳答案 “DLL”是windows喜欢给自己的动态库命名的方式"SO"是linux喜欢给他们的动态库命名的方式两者的目的相同:动态加载。Windows使用PE二进制格式,linux使用ELF。体育:http://e

c++ - MinGW-Clang 的 libgcc_s_dw2-1.dll 丢失了吗?

当我尝试运行rubenvb'sClang3.2时,我得到:Theprogramcan'tstartbecauselibgcc_s_dw2-1.dllismissingfromyourcomputer.Tryreinstallingtheprogramtofixthisproblem.我在任何地方都找不到DLL...我缺少什么包/我该如何解决这个问题? 最佳答案 您还需要下载一个gcc包,Clang的构建没有C++库或任何东西。它的意思是与gcc包结合使用。来自here:HereyouwillfindthelatestClangcom

c# - 在 C# 中加载 C++ DLL

我正在尝试使用用C++编写的DLL,但我的应用程序是用C#编写的DLL来自另一家公司,但他们为他们的软件提供了SDK。他们给出了如何在C++中加载他们的DLL的示例,但我需要将其调整为C#。下面是他们在C++中如何做到这一点的说明MarkEzd.dll文件是动态链接库。MarkEzdDll.h是MarkEzd.dll中导出函数的头文件MarkEzd.dll的调用方式是显式链接。开发者需要通过调用WindowsAPI函数来加载和释放MarkEzd.dll。步骤如下。调用Windows的API函数LoadLibrary()动态加载DLL;调用Windows的API函数GetProcAddr