我有一个无人管的C++类,我用无人的dll编写.我有一个托管的dll引用了非托管的dll.托管dll中的类可以从非托管类派生吗?
使用Visual Studio 2008
我有一个名为 Foo 的 C# .NET 库,它生成一个 Foo.dll 文件。它也可以通过 .config 文件进行配置,如下所示:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Foo.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>
</configSections>
<applicationSettings>
<Foo.Properties.Settings>
<setting name="Server" serializeAs="String">
<value>localhost</value>
</setting>
</Foo.Properties.Settings>
</applicationSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我想要做的是从名为 Bar 的非托管 C++ 程序调用此 .NET 库中的函数,并能够从非托管 C++ 应用程序更改其配置。通过在 Foo 中将类/接口属性 ComVisible 设置为 true,我能够从 Bar 调用 Foo 函数。但是,我无法从非托管 C++ 应用程序更改 .config 文件值——服务器始终为 "localhost"。
我正在尝试做什么——从非托管 C++ 配置 .NET 库——甚至可能吗?
我试图将C++代码移植到C#.该代码用于注册窗口类RegisterClassEx.
C++代码有一个对象WNDCLASSEX wcex.对象wcex有一个属性
wcex.cbSize = sizeof(WNDCLASSEX);
Run Code Online (Sandbox Code Playgroud)
在C#中,我将结构定义为
[StructLayout(LayoutKind.Sequential)]
public struct WNDCLASSEX
{
public uint cbSize;
public uint style;
[MarshalAs(UnmanagedType.FunctionPtr)]
public PlatformInvokeGDI32.WNDPROC lpfnWndProc;
public int cbClsExtra;
public int cbWndExtra;
public IntPtr hInstance;
public IntPtr hIcon;
public IntPtr hCursor;
public IntPtr hbrBackground;
public string lpszMenuName;
public string lpszClassName;
public IntPtr hIconSm;
}
Run Code Online (Sandbox Code Playgroud)
我试图使用大小
wcex.cbSize = (uint)sizeof(WNDCLASSEX);
Run Code Online (Sandbox Code Playgroud)
包含此stament的函数声明为
unsafe private void
Run Code Online (Sandbox Code Playgroud)
我希望unsafe这会使法规有效.但是,我在IDE中收到此错误:
Cannot take the address of, get the size of, or declare a pointer …
我需要将C#字符串写入编码为Utf8的预分配非托管缓冲区.在回答之前,请阅读以下要求:
目前,我正在使用OpCodes.Cpblk将原始字符串从C#复制到使用16位字符的非托管缓冲区.这给了我与在x64架构上使用非托管memcpy大致相同的性能,我真的需要吞吐量接近它.
我正在考虑将字符串固定为char*并对其进行迭代,但实现不带跳转表的编码器既麻烦又不太理想.
我想知道如何在 Visual C++ 中编写非托管异常?
#include <string>
#include <exception>
using namespace std;
using namespace System;
class GraphException : public Exception
{
public:
GraphException() { }
// GraphException(string message) : Exception (message)
// { }
// GraphException(string message, Exception inner) : Exception (message, inner)
// { }
};
Run Code Online (Sandbox Code Playgroud)
这不起作用我收到以下错误,
错误 1 错误 C3625:“GraphException”:非托管类型无法从托管类型“System::Exception”派生 c:\breadthfirst\graph\graphexception.h 10 1 广度优先
有人可以帮帮我吗?
这是我的另一个问题,也引用了这个问题作为参考: 如何从Un-managed C++调用托管C++方法
我已经成功创建了一个C#COM文件.现在我需要一个关于如何在非托管C++中实现它的简单解释.
我正在关注这个例子,但是c ++部分很弱. http://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C
这是我的COM文件
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace cSharpRiJHarn
{
[Guid("ED1483A3-000A-41f5-B1BC-5235F5897872")]
public interface DBCOM_Interface
{
[DispId(1)]
String encrypt(string s);
[DispId(2)]
String decrpyt(string s);
}
[Guid("A6BCEC1D-B60C-4c97-B9AD-1FE72642A9F8"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
{
}
[Guid("7C13A8C6-4230-445f-8C77-0CA5EDECDCB5"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(DBCOM_Events))]
public class RijndaelLink : DBCOM_Interface
{
public String encrypt(String s)
{
return Rijndael.EncryptString(s);
}
public String decrpyt(String s)
{
return Rijndael.DecryptString(s);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我只想要一个非常基本的例子来使用非托管代码.请在你的答案中包括:
谢谢你的帮助!
我不明白.例如,我们在代码中有一个OutputStream类型的变量,当我们停止使用它时,我们应该在它上面调用close(),以及为什么它没有以这种方式实现:GC在它清理时调用close()本身这个变量?
更新: 确定到目前为止我已经得出结论:释放非托管资源不仅仅是释放内存更重要的是我们现在没有内部行为,它可能存在对此资源数量的限制(连接数/处理程序)这就是为什么我们需要尽快释放它们.我对吗?因为如果它完全是关于内存的,那么我不知道为什么GC不能像管理资源那样完成工作.
我有一个.NET应用程序,它在单独的线程中(每5秒一次)定期调用非托管方法。而且这种方法有时会崩溃。我需要以某种方式处理这种情况。主要问题是我无法更改c ++非托管代码。
我尝试了不同的方式来处理此异常,但是没有成功:
通常
尝试{}捕获(异常例外){}
和
try {} catch {}
Run Code Online (Sandbox Code Playgroud)
2
AppDomain.CurrentDomain.UnhandledException + = CurrentDomain_UnhandledException;
3 System.Windows.Threading.Dispatcher.CurrentDispatcher.UnhandledException + = CurrentDispatcher_UnhandledException;
4. Application.Current.DispatcherUnhandledException + = Current_DispatcherUnhandledException;
无论如何,它只是默默地崩溃。
从逻辑上讲,应该重新启动该线程,但是我知道Thread.Abort()是一种不好的做法。在这种情况下的最佳做法是什么?
提前致谢。
我正在一个涉及RSA加密的swift项目中工作,我遇到了如下指针问题:
我有一个全局var publicKey: SecKey?可选值,我需要获取UnsafeMutablePointer<Unmanaged<SecKey>?>指向它的指针,这是SecKeyGeneratePair函数中所需的数据类型 .
我试图将指针定义为:
var keyPointer = UnsafeMutablePointer<Unmanaged<SecKey>?>(publicKey!)
Run Code Online (Sandbox Code Playgroud)
但是编译器抱怨a 不能使用@lvalue SecKey类型的参数调用'init'错误
根据使用Swift with Cocoa和Objective-C的书,在Core Foundation和Unmanaged Objects部分中,它声明该Unmanaged<T>结构提供了2种方法takeUnretainedValue()和takeRetainedValue().但试图实现它们,会出现以下错误
var keyPointer = UnsafeMutablePointer<Unmanaged<SecKey>?>(publicKey!.takeRetainedValue())
Run Code Online (Sandbox Code Playgroud)
'SecKey'没有名为'takeRetainedValue'的成员
任何帮助解决这个问题将不胜感激
作为我第一次作为学生员工编程,我必须在C#.NET中创建一个可以从Delphi调用的DLL.
由于Delphi是本机代码并且.NET正在被管理,我读到这并不容易.
我还读过罗伯特·吉塞克的"非管理出口".这可能是解决方案吗?
由于我的机器上没有Delphi(Delphi不是免费的),我无法为自己测试.
另外,当我实现非托管导出时,我的数据类型是否会出现问题?
最后但并非最不重要的是,是否有一种我可以使用的语言与Delphi加载DLL有同样的问题?能够测试对我来说很好.