Tag: dll

如何从嵌入式DLL中解析时正确使用JSON.NET?

我在Visual Studio中编写C#代码。 我在项目中添加了嵌入式DLL,我正在动态加载程序集。 我们使用JSON.NET来序列化和反序列化类型为Context.JobDataObj对象,该对象在其中一个嵌入式DLL中定义,并在各种程序之间传递DLL。 不幸的是,每当我尝试反序列化时,我都会收到以下错误: 在JSON中指定的类型’Context.JobDataObj,HPMContext,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’与’Context.JobDataObj,HPMContext,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’不兼容。 我查了JSON.NET源代码中的错误,错误是指IsAssignableFrom返回false …当我将DLL移出项目时,seralization和deseralization就像一个魅力。 更新: 我已经设法引入JSON.NET源代码并对其进行调试……显然,它是否使用嵌入式DLL之间的唯一区别是IsAssignableFrom的返回值: if(objectType!= null &&!objectType.IsAssignableFrom(specifiedType)) objectType在各种方式上都与specifiedType相等,我检查了它的所有程序集,类型,接口,成员等等。有谁知道IsAssignableFrom如何确定它的值?

C#结构 – 从外部库访问类

关于构建我的应用程序的正确方法,我有一个问题。 我是C#的初学者,所以如果我有一些基础缺失的借口。 我在网上看了(不仅是stackoverflow),但没有找到任何答案,所以也许这只是因为我做错了什么? 我有一个项目,其中有几个类来定义我的对象。 Object1.class.cs Object2.class.cs …… 现在,对于某些函数,我创建了类库(.dll文件)来外部化代码。 我的想法是,如果我需要进行更新,我只需要替换.dll文件,而不是所有代码。 但是当我想将对象发送到该类时遇到问题,我认为因为它们是解决方案的外部因素? 所以我开始怀疑我是否正确地做到了。 1)有没有办法将项目中的对象发送到我单独创建的类? 2)以这种方式工作是一个好主意吗? 我的意思是,我当然可以在我的项目中添加库,但在这种情况下,我将不会分离.dll文件,并且所有文件都在一个.exe文件中。 3)当我需要测试我的课程时,我总是需要关闭我的项目,打开课程进行编辑,然后回到我的项目进行测试。 有更简单的方法吗? 提前感谢您的建议 编辑2。 Simone Cifani perfercly回答了我的问题: 1)课程必须外化 2)在我的外部库中添加对必要类的引用 3)在我的主项目中添加对每个类和外部库的引用 由于我不知道如何使用Interfaces,我会在没有它的情况下使用它,但我认为即使没有它也会很好。

将实际值从fortran77 dll返回到c#

有人可以指出我在这里做错了什么吗? FORTRAN 77 dll代码 *$pragma aux DON “DON” export parm(value*8,value*8) SUBROUTINE DON(DAA,DBB,DCC) REAL*8, DAA,DBB,DCC DBB=DAA+1 DCC=DBB+1 RETURN END C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Diagnostics; namespace pDON { class Program { [DllImport(“DON.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern void DON( [MarshalAs(UnmanagedType.R8)] double DAA, [MarshalAs(UnmanagedType.R8)] double DBB, […]

c#中的C ++非托管DLL

我被要求在我的项目中集成网络摄像头ZoneTrigger。 该站点提供的SDK也是C ++的样本。 我已经能够使用很少的function。 我被卡住的地方是一个函数,其中char *是传递的参数。 我做了很多挖掘,并且已经知道必须使用MarshalAs …… 我想从c ++代码导入的函数 //header file struct ZT_TRIG_STRUCT { int aSize; //STRUCT size int CameraIndex; int SpotIndex; int SpotType; char SpotName[32]; DWORD Dummy[16]; }; typedef int (WINAPI *f_ZT_EnumerateHotSpots)(int SpotIndex, char *Name, int *SpotType); /* You application can call this functions to retrieve information about spots by iterating the SpotIndex […]

如何将C#dll注入另一个进程

任何人都知道如何创建C#DLL然后将它们注入另一个进程(而不是.net)并执行我的代码,覆盖现有方法?

从DLL中调用C#中的C ++函数 – 奇怪的参数

我有一个用C ++写的函数和下一个标题: void EncodeFromBufferIN(void* bufferIN,int bufferINSize, unsigned char* &bufferOUT, int &bufferOUTSize); 我已经编辑了像这样的.h和.cpp文件,以便能够通过在C#中导入DLL来调用该函数: **EncodeFromBufferIN.h** extern “C” { __declspec(dllexport) void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char* &bufferOUT, int &bufferOUTSize); } **EncodeFromBufferIN.cpp** extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char* &bufferOUT, int &bufferOUTSize){ // stuff to be done } 但现在我的问题是我不知道如何在C#中调用该函数。 我在C#中添加了下一个代码,但不确定如何将参数传递给函数。 [DllImport(“QASEncoder.dll”)] unsafe public static extern void EncodeFromBufferIN(void* […]

为什么我可以在Vista上找到DLL未找到的exception而不是XP?

我有一个依赖于几个托管库的应用程序。 这些托管库反过来依赖于一些非托管库。 当我将应用程序部署到运行XP的计算机时,它运行正常。 当我在运行Vista的机器上执行相同操作时,我得到一个未找到DLL的exception。 我已经尝试过VS2010安装项目和NSIS安装程序来进行部署,两种情况都是一样的。 为什么会这样? 我该怎么做才能绕过它? 更新 – 更多细节 两个安装程序都检查.NET 4.0的安装并在必要时安装它 Vista计算机是64位,但安装将按预期定向到x86程序文件文件夹 在这两种情况下我都有一个管理员帐户 DLL与可执行文件保存在同一目录中 据我所知,文件被复制到正确的目录 更新2 完整错误发生在http://pastebin.ca/2046487 DLL是Audiere.Net.dll,它是我的一个,是一个托管库。 我不确定该错误是否意味着它无法找到Audiere.Net.dll,或者它是否无法加载它,因为无法找到其中一个依赖项。 更新3 – 来自Process Monitor的资料 运行进程监视器后(感谢Mehrdad!),有几个条目没有“SUCCESS”状态。 其中一些是“NAME NOT FOUND”,有些是“未找到路径”。 (它甚至查询PDB文件,我原本认为它只是由调试器使用。)很难看出哪些条目可能是导致实际失败的条目。 无论如何,我已经上传了日志 (过滤了相关路径)以防万一对任何人都有意义。 更新4 – 添加.pdb文件 所以我有点绝望,并将.pdb文件包含在安装程序的输出中。 我认为它没用,但它实际上导致了更有用的错误。 我现在得到一个BadImageFormatException而不是简单地说找不到DLL。 谷歌搜索告诉我,这是在x86上编译的二进制文件的常见问题,但是在x64上运行(就像Vista机器一样)。 建议的补救措施是强制它以x86为目标,但Audiere.Net.dll已经是。 错误在于它包装的库吗?

从C#调用C#

我来自电气工程师背景,因此我的知识很少关于C#,DLL等….我想将c函数用于C#。 我知道有一些关于这个的post,但我找不到一个足够简单的post。 目前,我在USB端口上有C函数调用windows API来读/写。 首先创建.dll我需要头文件吗? 因为我将以下函数decleration函数放入标题中。 我在堆栈溢出和Internet上看到的示例只使用一个简单的.c文件,我可以摆脱头文件吗? __declspec(dllexport) LMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID, unsigned short usPID, LPGUID lpGUID, BOOL *pbDriverInstalled); __declspec(dllexport) LMUSB_HANDLE __stdcall InitializeDeviceByIndex(unsigned short usVID, unsigned short usPID, LPGUID lpGUID, DWORD dwIndex, BOOL bOpenDataEndpoints, BOOL *pbDriverInstalled); __declspec(dllexport) BOOL __stdcall TerminateDevice(LMUSB_HANDLE hHandle); __declspec(dllexport) BOOL __stdcall WriteUSBPacket(LMUSB_HANDLE hHandle, unsigned char *pcBuffer, unsigned long ulSize, unsigned long […]

如何自动将版本号插入AssemblyName

我正在努力建立这个问题: 从MSBuild中的文件中读取单个值 我的目标是有一个地方放置在多个项目中使用的版本号,我还想要其中一个项目的DLL文件名中的部分版本号。 基于上面的问题,我已经得到了第一部分,但我对第二部分遇到了困难,并希望得到一些指导。 在我的解决方案中,我设置了一个名为Version.txt的纯文本文件,仅包含我的完整版本号: 1.1.0.0 在我的两个项目中,我打开了AssemblyInfo.cs文件并删除了AssemblyVersion和AssemblyFileVersion项,然后修改了两个项目以在单独的文件中生成它们,如上面的问题所述。 现在,当我构建时,我为每个项目生成一个生成的Properties \ Version.cs文件,该文件用于构建EXE / DLL并在其文件属性中显示为“1.1.0.0”。 这正是我想要的。 对于DLL,我想命名程序集“filename.v1.1.dll”,其中“1.1”来自上面Version.txt中的前两个组件。 只要我能在EXE / DLL属性中获得完整的“1.1.0.0”并在DLL文件名中获得“1.1”,我就可以灵活地使用Version.txt的格式。 为了试试这个,我修改了DLL的csproj文件,使其具有: dllfile dllfile.v$(VersionNumber) 当然,这会在文件名中插入完整版本号,这是我不想要的。 有没有人有关于如何进行的任何提示? 谢谢。 编辑:我已经能够通过将以下内容添加到我的.csproj BeforeBuild目标中来提取版本号的主要/次要组件: $(VersionNumber.IndexOf(‘.’)) 0 $(VersionNumberFirstDotIndex) $([MsBuild]::Add(1, $(VersionNumberFirstDotIndex))) $(VersionNumber.IndexOf(‘.’, $(VersionNumberMinorStart))) $([MSBuild]::Subtract($([MSBuild]::Subtract($(VersionNumberSecondDotIndex), $(VersionNumberFirstDotIndex))), 1)) $(VersionNumber.Substring($(VersionNumberMajorStart), $(VersionNumberMajorLen))) $(VersionNumber.Substring($(VersionNumberMinorStart), $(VersionNumberMinorLen))) $(VersionNumberMajor).$(VersionNumberMinor) 我现在唯一缺少的是如何将此VersionNumberShort转换为DLL文件名。 除非有人有更好的想法,否则我可以采取Peter的建议并使用Move任务: 由于我需要与以前相同的属性定义,因此我将上面的代码段移动到“Common”目标中,并在此处显示的构建和清理任务中引用它。 彼得 – 如果你想把你的评论作为答案,我会接受它。 谢谢! 编辑:按照jdlugosz的回答,我尝试在我的任务中设置AssemblyName。 不幸的是,根据顶部列出的原始示例,这似乎仍然没有任何影响: … dllfile.v$(VersionNumber) 我尝试从Visual Studio Developer命令提示符运行MSBuild: msbuild […]

C#无法加载DLL(无法找到模块HRESULT:0x8007007E)

错误:无法加载DLL’x.dll’:找不到指定的模块。 (HRESULTexception:0x8007007E) 操作系统:Windows 7 我有两个站,Visual Studio 2012,使用.net 4.0; 另一个没有VS安装在VS2012的第一站我有一个C#解决方案,导入了C ++项目。 我正在使用: [DllImport(“x.dll”, CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs(UnmanagedType.I4)] 在这个站上工作。 但是当我移动另一个站(没有安装VS)时,它出现了错误。 如果我安装VS,它正在工作。 出现此问题的可能原因是什么? 关于我可能缺少什么或如何调试此问题的任何想法?