这开始是一种查找C++/CLI和托管C++程序集的方法,以便可以测试它们内部的所有类,以确保重新实现所有继承的方法.我想将此添加为构建过程步骤,以确保它不会再次发生.
考虑到这个问题也让我有点好奇,因为能够确定使用的任何.NET语言会很有趣.因此,我进一步比较了所有.NET语言的程序集.到目前为止,我通过我编写的一个小程序发现了这一点,它通过反射比较来自任何.NET程序集的类型和属性数据:
按此顺序解析可能是合理的:
然而,由于这是一个可怕的黑客,我想在这里检查,以确保没有其他选项可用.
我是与非托管库交互的新手.我有一个非托管的C函数,它通过函数内的引用修改字符串.我在从C#传递字符串并通过C函数修改它时遇到了麻烦.
这是C函数:
__declspec(dllexport) void __stdcall Test(char* name)
{
*name = "Bar";
}
Run Code Online (Sandbox Code Playgroud)
这是C#DLL导入代码:
[DllImport(@"C:/blah/mylibrary.dll")]
public extern static string Test(string name);
Run Code Online (Sandbox Code Playgroud)
这是我用来调用函数的代码:
string s = "foo";
Test(s);
//I want s to be "Bar" after the above line
Run Code Online (Sandbox Code Playgroud)
我尝试在字符串参数上使用"ref"和"out",并尝试将编组作为LPStr.根据我的尝试,我得到一个错误
"作为String传入的指针不能位于进程地址空间的底部64K."
要么
"试图读取或写入受保护的内存.这通常表明其他内存已损坏."
我确定我只是用我的指针做一些愚蠢的事情.有人可以帮我确定合适的C#代码,使"s"等于"bar"吗?
谢谢
我有一个.NET表单,以及我的Visual Studio中的本机代码.问题是:我不能在我的本机代码中声明我的.NET表单的全局实例,如下所示:
Editor^ maineditor;
Run Code Online (Sandbox Code Playgroud)
它给了我这个问题:
error C3145: 'EditorEntry' : global or static variable may not have managed type 'Cube3D::Editor ^'
Run Code Online (Sandbox Code Playgroud) 我正在编写一个托管自定义操作.我正在使用Windows Installer Xml中的DTF Framework将托管dll包装到可用的CA dll中.CA做了它应该做的事情,但我仍然遇到错误处理问题:
Dim record As New Record(1)
' Field 0 intentionally left blank
' Field 1 contains error number
record(1) = 27533
session.Message(InstallMessage.Error, record)
Run Code Online (Sandbox Code Playgroud)
上面的代码生成MSI日志中显示的以下文本:
MSI(c)(C4!C6)[13:15:08:749]:产品:TestMSI - 错误27533.区分大小写的密码不匹配.
错误号是指MSI中Error表中包含的代码.上面显示的消息是正确的.
我的问题是:为什么Windows Installer不会创建一个对话框来通知用户该错误?
我正在尝试从一个字节数组创建一个双重托管数组.我目前有问题,但我想优化.这是我想要使用的一些代码:
private unsafe static double[] _Get_Doubles(byte[] _raw_data)
{
double[] ret;
fixed (byte* _pd = _raw_data)
{
double* _pret = (double*)_pd;
ret = (double[])*_pret; //FAILURE
}
}
Run Code Online (Sandbox Code Playgroud)
请让我知道如何处理这些问题.
-Aaron
正确构建托管代码Visual Studio(并递归地)将引用的托管项目的dll复制到正在构建的项目的输出文件夹中.
但是,如果其中一个引用是依赖于非托管dll的托管DLL,则这些非托管DLL不会复制到输出文件夹,即使它们在相同解决方案中的相应项目并列为托管DLL的依赖项.
我意识到可以通过让所有项目使用相同的输出文件夹来解决此问题.我们已经为大多数项目执行了此操作,但我们更喜欢将单元测试输出文件夹分开,导致上述问题用于使用具有非托管依赖项的托管Dll的单元测试.
我们现在使用的解决方案是复制必要的DLL的预构建事件,但这会浪费时间并且容易出错,因为需要为使用托管DLL的每个项目重复这些事件.
因此,我想知道是否有一种方法可以让构建系统理解它应该总是在它决定复制托管DLL时复制托管DLL的非托管依赖项?
我正在编写一个非常高性能的应用程序,每毫秒处理和处理数百个事件.
Unmanaged C++比托管c ++更快吗?为什么?
托管C++处理CLR而不是OS和CLR负责内存管理,这简化了代码,并且可能比非托管C++中"程序员"编写的代码更有效?还是有其他原因?当使用托管时,如果对程序员透明并由CLR处理,那么如何避免动态内存分配(这会导致性能损失)?
回到我的问题,托管C++在速度方面是否比非托管C++更有效?为什么?
我目前正在为非托管dll创建托管包装器.Point是包装器对非托管dll进行TON调用,但本身只输出很少的方法.从我做的研究中,这应该是安全的,但我想确保我得到正确的.基本上这就是我在做的方式.
[SuppressUnmanagedCodeSecurity()]
internal static class SomeAPI
{
[DllImport("base.dll"]
internal static extern bool Somefunc();
[...] Other internal DllImports
}
public class Wrapper : IDisposable
{
[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
public Wrapper()
{
SomeAPI.SomeFunc();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
protected override void Dispose(bool disposeManagedResources)
{
SomeAPI.SomeFunc();
}
}
Run Code Online (Sandbox Code Playgroud)
我添加的每个受保护或公共的方法都应该获得[SecurityPermission(SecurityAction.Demand,UnmanagedCode = true)]属性.我的意思是每一个都避免意外的代码路径导致SomeAPI调用.
现在添加到内部或私有的Wrapper的任何方法都是"安全的".这个假设是否正确?
对不起,如果我不清楚.我正在编写包装器,因此它不会重新格式化硬盘驱动器或类似的东西.包装器将在其自己的托管dll中显示(以及其他内容).因为对包装器的一次调用可能导致对非托管dll的100次调用,所以我不希望CLR的性能开销检查所有这些调用 - 因此使用SuppressUnmanagedCodeSecurity.文档提到"非常谨慎地使用此属性.不正确的使用可能会产生安全漏洞.",这就是我要问的问题,使用上述方法再次"安全".
如标题中所述,我希望我的旧C++库在托管.NET中运行.我想到了两种可能性:
1)我可能尝试使用/ clr编译库并尝试"It Just Works"方法.
2)我可能会将托管包装器写入非托管库.
首先,我想让我的库快速工作,就像在非托管环境中一样.因此,我不确定第一种方法是否会导致性能大幅下降.但是,实现它似乎更快(不是一个正确的词:-))(假设它对我有用).
另一方面,我想到了编写包装器时可能出现的一些问题(例如,如何包装一些STL集合(vector例如)?)我想写一个与非托管C++驻留在同一个项目中的包装器 - 是合理的方法(例如MyUnmanagedClass,MyManagedClass在同一个项目中,第二个包装另一个)?
你会在那个问题上提出什么建议?哪种解决方案能够让我更好地了解生成的代码?
提前感谢您的任何建议和线索!
干杯
managed ×10
unmanaged ×6
.net ×3
c++ ×3
c# ×2
c++-cli ×2
arrays ×1
c ×1
clr ×1
dependencies ×1
dll ×1
global ×1
managed-c++ ×1
native ×1
performance ×1
pinvoke ×1
pointers ×1
variables ×1
visual-c++ ×1
wrapper ×1